关于base64加密

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

// basic64加密算法等价php函数base64_encode()

function encode_base64($str)
{
	$base64_alphabet = array('A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
           'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
           'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
           'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', '=');
	$strlen = strlen($str);
 
	for($i = 0; $i < $strlen; ++$i)
	{
		$asc = sprintf("%b", ord($str[$i]));
		// 补0
		$as_len = 8 - strlen($asc);
  
		for($j = 0; $j < $as_len; ++$j) $asc = '0' . $asc;
  
		$tmp1 .= $asc;  
	}

	$len1 = $strlen * 8;
	$residue = $len1 % 6;
	
	if($residue)
		$len2 = 6 - $len1 % 6;
	else
		$len2 = 0;
  
	$len3 = ($len1 + $len2) / 6;
	
	if($len2) $tmp1 .= $len2 > 2 ? '0000' : '00';

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

	return $decode_str;
}

// basic64解密算法等价php函数base64_decode()

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

	for($i = 0; $i < $strlen; ++$i)
	{
		if($str[$i] == '=') break;
		else
		{
			if(!isset($base64_alphabet[$str[$i]]))
			{
				echo $str[$i] . ':传入的加密字符串非法。';
				exit();
			}
			
			$tmpstr = $base64_alphabet[$str[$i]];
			$asc = sprintf("%b", $tmpstr);
		}
	
		$as_len = 6 - strlen($asc);
  
		for($j = 0; $j < $as_len; ++$j) $asc = '0'.$asc;
  
  	$tmp1 .= $asc;  
	}
 
	$len = ceil(strlen($tmp1) / 8);
 
	for($i = 0; $i < $len; ++$i)
	{
		$decode_str .= chr(bindec(substr($tmp1, $i * 8, 8)));
	}

 return $decode_str;
}

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

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

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值