何谓 Base64 加密算法及原理,如何使用 PHP 实现一个 Base64_encode

Base64 加密算法
Base64 算法将每连续对 3 个字节(共 24 位)的内容,平均非为 4 部分每部分 6 位。
6个字节能表达的正整数范围为 0 - 31,共64个数字。我们使用 US-ASCII子集的 64 个字符
+、/、数字 0-9、小写字母 a-z、大写字母 A-Z 组成一个 64 字符对字符表,对于 4 字节
中的每一个数字都能找到一个字母与之对应,那么,就能将 3 个字节对数据转为 4 个字母,
对于末尾,可能不够三个字节的使用 “= ”填充 4 个字中所缺对部分。
我们以 zp 为例说说明以下基本过程:
zp 多应对 ASCII 码为分别为 122 和 112,对应对二进制表示为:
1111010 1110000
按 6 位一组就转换为:
11110 100111 00
现在还只有 3 部分,还差一部分,用 = 填充,然后转化为十进制表示为:
30 39 0
影射默认对字符表,并填充上不足的字:
"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", "+", "/"
得到对编码为:
enA=

Base64 不仅能加密字符串还能加密二进制文件。
这里我们用 php 来实现一个 Base64加密对算法,虽然 PHP 里面有了 base64_encode
但是这里我们为了演示算法实现过程就重写以下,这里我们使用对默认对字符表,当然我们可以通过
改变字字符表中字符对位置来实现专有对 Base64 加密,但是解密算法也要自己使用对有对字符表实现,
这里为了更加详细第演示算法过程,就没有对代码进行量上对优化:
function zpz_base64_encode($sText){
	//这里我们可以采用直接从数字构造或者从一个字符串构造
	$aTable = 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', '+', '/'
	);

	$iLength = strlen($sText);
	$iDelta = $iLength % 3;
	$iLen = $iLength - $iDelta;
	$i = 0;
	$aResult = array();
	while($i < $iLen){
		$iCode1 = ord($sText[$i++]);
		$iCode2 = ord($sText[$i++]);
		$iCode3 = ord($sText[$i++]);

		//将 3 个字节 24 位平均分成 4个部分
		$iEncoded1 = $iCode1 >> 2;
		$iEncoded2 = (($iCode1 & 3) << 4) | ($iCode2 >> 4);
		$iEncoded3 = (($iCode2 & 15) << 2) | ($iCode3 >> 6);
		$iEncoded4 = $iCode3 & 63;

		array_push(
			$aResult,
			$aTable[$iEncoded1],
			$aTable[$iEncoded2],
			$aTable[$iEncoded3],
			$aTable[$iEncoded4]
		);
	}

	//不够 3 个字节的,分为 1 个字节和 2 个字节来处理
	if(2 === $iDelta){
		$iCode1 = ord($sText[$i++]);
		$iCode2 = ord($sText[$i]);

		$iEncoded1 = $iCode1 >> 2;
		$iEncoded2 = (($iCode1 & 3) << 4) | ($iCode2 >> 4);
		$iEncoded3 = ($iCode2 & 15) << 2;

		array_push(
			$aResult,
			$aTable[$iEncoded1],
			$aTable[$iEncoded2],
			$aTable[$iEncoded3],
			'='
		);
	}
	else if(1 === $iDelta){
		$iCode1 = ord($sText[$i]);

		$iEncoded1 = $iCode1 >> 2;
		$iEncoded2 = ($iCode1 & 3) << 4;

		array_push(
			$aResult,
			$aTable[$iEncoded1],
			$aTable[$iEncoded2],
			'=',
			'='
		);
	}

	return join('', $aResult);
}

如何解密Base64加密的字符串,我们下一篇接着讲Base64解密(base64_decode)原理及如何使用 PHP 实现

One Trackback

  1. […] 薹翮 我悄悄地离开,在昨天;今天我又静静地到来 SEO 查询工具   « 和谓 Base64 加密算法及原理,如何使用 PHP 实现一个 Base64_encode […]

Post a Comment

Your email is never shared. Required fields are marked *

*
*