Base64編碼
Base64編碼是一種基于64個字符的編碼,按照RFC2045的定義,Base64被定義為:Base64內容傳送編碼被設計用來把任意序列的8位字節描述為一種不易被人直接識別的形式。完整的Base64定義可見RFC 1421和RFC 2045。編碼后的數據比原始數據略長,為原來的?,編碼中往往會以“=”號來結尾,這是因為其編碼表的第64位是用“=”來補位的原因。嚴格的來講Base64并不能算是加密算法,主要原因是因為其編碼表是公開的,但是如果自己自定義一個編碼表并不將其對外公開,也是可以起到加密的作用的。對于不同的編碼,生成的密文會出現不一致的情況。
實現原理
Base64算法主要是對給定的字符以與字符編碼(如ASCII字符,UTF-8碼)對應的十進制數為基準,做編碼操作:
1、將給定的字符串以字符為單位轉換為對應的字符編碼(如ASCII碼)。
2、將獲得的字符編碼轉換為二進制碼。
3、對獲得的二進制碼做分組轉換操作,每3個8位二進制碼為一組,轉換為每4個6位二進制碼為一組(不足6位時低位補0)。這是一個分組變化的過程,3個8位二進制碼和4個6位二進制碼的長度都是24位(38=46)。
4、對獲得的4個6位二進制碼補位,向6位二進制碼添加2位高位0,組成4個8位二進制碼。
5、將獲得的4個8位二進制轉換為十進制碼。
6、將獲得的十進制碼轉換為Base64字符表中對應的字符。
Base64實現
Bouncy Castle、Common Codec和Sun都提供了Base64的實現,其中Sun的實現是不被推薦使用的,首先他的實現并不開源,而且使用的時候會警告可能會在將來的版本中刪除。Bouncy Castle和Common Codec其實現方式最大的區別就是Common Codec提供了RFC2045標準的Base64實現,每76個字符加一個換行符,如果當前行不足76個字符,也要加換行符。
URLBase64
Base64編碼可用于在HTTP環境下傳遞較長的標識信息,Bouncy Castle和Common Codec同樣也提供了實現。相對于其對Base64的實現有略微的差異,URL的參數中是不允許出現“=”的,所以采用新的符號作為補位,其中Bouncy Castle是采用“.”作為填充的,而Common Code的URLBase64實現直接舍棄掉了補位符!也就是說他的URLBase64實現編碼是不定長的。
參考:
1、維基百科:https://zh.wikipedia.org/wiki/Base64
2、《JAVA加密與解密的藝術》