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