`
baobaoupup
  • 浏览: 471295 次
文章分类
社区版块
存档分类
最新评论

关于base64加密

 
阅读更多
今天研究了一下base64加密,base64加密算法在加密要求不高的网络通信中应用非常广泛。你若有兴趣打开Local Settings/Temporary Internet Files即ie的缓存或有时在ie地址栏里,你可以看到类似‘GVkIHN0cmluZw==’的字符串,这字符串就是经过base64加密的。
<wbr></wbr>
原理就是
1.将字符串中的每个字符转换成8位的2进制数(位数不够在高位加0,如a的2进制数为‘1100001’他是7为就变为‘01100001’),将每个字符的2进制数连在一起就得到一个一长串的0,1。
2.再在这一个串中6位6位的取数将其转化为10进制数,就可以在如下表中对应找到字符,这样就得到了加密后的字符串。
0 A<wbr><wbr> 9<wbr><wbr>J<wbr> 18 S<wbr> 27 b<wbr> 36 k<wbr> 45 t<wbr> 54 2<wbr> 63 /</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
1 B<wbr><wbr> 10<wbr>K<wbr> 19 T<wbr> 28 c<wbr> 37 l<wbr> 46 u<wbr> 55 3<wbr> 64 =</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
2 C<wbr><wbr> 11 L<wbr> 20 U<wbr> 29 d<wbr> 38 m<wbr> 47<wbr>v<wbr> 56 4<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
3 D<wbr><wbr> 12 M<wbr> 21 V<wbr> 30 e<wbr> 39 n<wbr> 48 w<wbr> 57 5</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
4 E<wbr><wbr> 13 N<wbr> 22 W<wbr> 31 f<wbr> 40<wbr>o<wbr> 49 x<wbr> 58 6</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
5 F<wbr><wbr> 14 O<wbr> 23 X<wbr> 32 g<wbr> 41 p<wbr> 50 y<wbr> 59 7</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
6 G<wbr><wbr> 15 P<wbr> 24 Y<wbr> 33<wbr>h<wbr> 42 q<wbr> 51 z<wbr> 60 8</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
7 H<wbr><wbr> 16 Q<wbr> 25 Z<wbr> 34 i<wbr> 43 r<wbr> 52 0<wbr> 61 9</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
8 I<wbr><wbr> 17 R<wbr> 26 a<wbr> 35 j<wbr> 44 s<wbr> 53 1<wbr> 62 +</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
(在处理最后一个6位时可能碰到,2进制字符串就剩2位或4位的情况,就在最后加4个0或2个0凑足6位,加4个0时就要在最后得到的加密后的字符串加2个'='号,2个就加一个‘=’号)
解密就时相反过程,就不详细叙述了。
呵呵,感觉有点意思就用php写了两个函数。稍加改动就可以变成其他语言版本的。代码如下:

// basic64加密算法等价php函数base64_encode()
function encode_base64($str)
{
<wbr>$base64_alphabet = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '=');<br><wbr>$strlen = strlen($str);<br><wbr><br><wbr>for($i = 0; $i &lt; $strlen; ++$i)<br><wbr>{<br><wbr><wbr>$asc = sprintf("%b", ord($str[$i]));</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr>// 补0<br><wbr><wbr>$as_len = 8 - strlen($asc);<br><wbr><wbr><br><wbr><wbr>for($j = 0; $j &lt; $as_len; ++$j)<br><wbr><wbr><wbr>$asc = '0'.$asc;<br><wbr><wbr><br><wbr><wbr>$tmp1 .= $asc;<wbr><wbr><br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>$len1 = $strlen * 8;<br><wbr>$residue = $len1 % 6;<br><wbr>if($residue)<br><wbr><wbr>$len2 = 6 - $len1 % 6;<br><wbr>else<br><wbr><wbr>$len2 = 0;<br><wbr><wbr><br><wbr>$len3 = ($len1 + $len2) / 6;</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>if($len2)<br><wbr>{<br><wbr><wbr>$tmp1 .= $len2 &gt; 2 ? '0000' : '00';<br><wbr>}</wbr></wbr></wbr></wbr></wbr>

<wbr>for($i = 0; $i &lt; $len3; ++$i)<br><wbr>{<br><wbr><wbr>$decode_str .= $base64_alphabet[bindec(substr($tmp1, $i * 6, 6))];<br><wbr>}<br><wbr><br><wbr>if($len2)<br><wbr>{<br><wbr><wbr>$decode_str .= $len2 &gt; 2 ? '==' : '=';<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>return $decode_str;<br>}</wbr>

// basic64解密算法等价php函数base64_decode()
function decode_base64($str)
{
<wbr>$base64_alphabet = array('A' =&gt; 0, 'B' =&gt; 1, 'C' =&gt; 2, 'D' =&gt; 3, 'E' =&gt; 4, 'F' =&gt; 5, 'G' =&gt; 6, 'H' =&gt; 7,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'I' =&gt; 8, 'J' =&gt; 9, 'K' =&gt; 10, 'L' =&gt; 11, 'M' =&gt; 12, 'N' =&gt; 13, 'O' =&gt; 14, 'P' =&gt; 15,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'Q' =&gt; 16, 'R' =&gt; 17, 'S' =&gt; 18, 'T' =&gt; 19, 'U' =&gt; 20, 'V' =&gt; 21, 'W' =&gt; 22, 'X' =&gt; 23,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'Y' =&gt; 24, 'Z' =&gt; 25, 'a' =&gt; 26, 'b' =&gt; 27, 'c' =&gt; 28, 'd' =&gt; 29, 'e' =&gt; 30, 'f' =&gt; 31,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'g' =&gt; 32, 'h' =&gt; 33, 'i' =&gt; 34, 'j' =&gt; 35, 'k' =&gt; 36, 'l' =&gt; 37, 'm' =&gt; 38, 'n' =&gt; 39,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'o' =&gt; 40, 'p' =&gt; 41, 'q' =&gt; 42, 'r' =&gt; 43, 's' =&gt; 44, 't' =&gt; 45, 'u' =&gt; 46, 'v' =&gt; 47,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'w' =&gt; 48, 'x' =&gt; 49, 'y' =&gt; 50, 'z' =&gt; 51, '0' =&gt; 52, '1' =&gt; 53, '2' =&gt; 54, '3' =&gt; 55,<br><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>'4' =&gt; 56, '5' =&gt; 57, '6' =&gt; 58, '7' =&gt; 59, '8' =&gt; 60, '9' =&gt; 61, '+' =&gt; 62, '/' =&gt; 63, '=' =&gt; 64);<br><wbr>$strlen = strlen($str);</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>for($i = 0; $i &lt; $strlen; ++$i)<br><wbr>{<br><wbr><wbr>if($str[$i] == '=')<br><wbr><wbr><wbr>break;<br><wbr><wbr>else</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>{</wbr>

<wbr><wbr> if(!$tmpstr = $base64_alphabet[$str[$i]])</wbr></wbr>

<wbr> {</wbr>

<wbr><wbr><wbr><wbr> echo '传入的加密字符串非法。';</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr> exit();</wbr></wbr></wbr></wbr>

<wbr><wbr> }<br><wbr><wbr><wbr>$asc = sprintf("%b", $tmpstr);</wbr></wbr></wbr></wbr></wbr>

<wbr>}<br><wbr><wbr>$as_len = 6 - strlen($asc);<br><wbr><wbr><br><wbr><wbr>for($j = 0; $j &lt; $as_len; ++$j)<br><wbr><wbr><wbr>$asc = '0'.$asc;<br><wbr><wbr><br><wbr><wbr>$tmp1 .= $asc;<wbr><wbr><br><wbr>}<br><wbr><br><wbr>$len = ceil(strlen($tmp1) / 8);<br><wbr><br><wbr>for($i = 0; $i &lt; $len; ++$i)<br><wbr>{<br><wbr><wbr>$decode_str .= chr(bindec(substr($tmp1, $i * 8, 8)));<br><wbr>}</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>return $decode_str;<br>}</wbr>

字符串‘This is an encoded string’用第一个函数加密后得到‘VGhpcyBpcyBhbiBlbmNvZGVk<wbr>IHN0cmluZw==’用第2个函数解密就可以回到‘This is an encoded string’。</wbr>

他可以将任何字符串加密成只有字母和数字‘+’‘/’的组合,

呵呵,php里有现成的函数我有注明。但自己写的话,那是不一样的。只要把函数里的两个$base64_alphabet数组对应打乱,就可以得到自己特有的加密算法了,别人就不是那么容易解你的密了。要更秘密可以用嵌套加密,而且每次加密的$base64_alphabet数组都不一样。这样的加密,你试试解码给我看看!!!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics