php如何实现md5算法?

发布时间:2024-09-22 点击:63
php实现md5算法:1、当数组元素超过整形长度时的自动转换;2、实现无符号右移操作;3、将字符串转换成8位存储为一个元素的数据结构。
php实现md5算法:
1、md5算法是对输入的数据进行补位,使得如果数据位长度len对512求余的结果是448。
即数据扩展至k512 448位。即k64 56个字节,k为整数。 具体补位操作:补一个1,然后补0至满足上述要求
2、补数据长度
用一个64位的数字表示数据的原始长度b,把b用两个32位数表示。这时,数据就被填补成长度为512位的倍数。
3. 初始化md5参数
四个32位整数 (a,b,c,d) 用来计算信息摘要,初始化使用的是十六进制表示的数字
a=0x01234567
b=0x89abcdef
c=0xfedcba98
d=0x76543210
4、处理位操作函数
x,y,z为32位整数。
f(x,y,z) = x&y|not(x)&z
g(x,y,z) = x&z|y?(z)
h(x,y,z) = x xor y xor z
i(x,y,z) = y xor (x|not(z))
5、主要变换过程
使用常数组t[1 … 64], t为32位整数用16进制表示,数据用16个32位的整数数组m表示。
php的实现基本按照上面的算法实现
对于php来说,特殊的位置有三点:
在于需要规避其在数组中,当数组元素超过整形长度时的自动转换;
无符号右移操作的实现;
将字符串转换成8位存储为一个元素的数据结构。
代码如下:
<?php $str = "1";$md5 = new md5($str);echo $md5->getdigist();echo "<br />", md5($str); class md5 { const char_alignment = 8; private $_digist; private $_state; public function __construct($str) { $bin = $this->_str2bin($str); $len = strlen($str) * self::char_alignment; $bin[$len >> 5] |= 128 << ($len % 32); $bin[((($len 64) >> 9) << 4) 14] = $len; $this->_md5init(); $this->_update($bin); $this->_digist = $this->_bin2hex($this->_state); } / * 公有方法 * 获取信息摘要 * @return string */ public function getdigist() { return $this->_digist; } private function _bin2hex($bin) { $hex_tab = "0123456789abcdef"; $str = ""; for ($i = 0; $i < count($bin) * 4; $i ) { $str .= $hex_tab[($bin[$i >> 2] >> (($i % 4) * 8 4)) & 0xf] . $hex_tab[($bin[$i >> 2] >> (($i % 4) * 8 )) & 0xf]; } return $str; } private function _update($bin) { $bin_len = count($bin); for ($i = 0; $i < $bin_len; $i = 16) { $block = array(); for ($j = 0; $j < 16; $j ) { $block[$j] = isset($bin[$i $j]) ? $bin[$i $j] : 0; } $this->_md5transform($block); unset($block); } } / * 初始化 */ private function _md5init() { $this->_state[0] = intval(0x67452301); $this->_state[1] = intval(0xefcdab89); $this->_state[2] = intval(0x98badcfe); $this->_state[3] = intval(0x10325476); return true; } private function _md5transform($block) { $a = $this->_state[0]; $b = $this->_state[1]; $c = $this->_state[2]; $d = $this->_state[3]; $x = $block; / round 1 */ md5tool::ff($a, $b, $c, $d, $x[0], md5tool::s11, 0xd76aa478); /* 1 */ md5tool::ff($d, $a, $b, $c, $x[1], md5tool::s12, 0xe8c7b756); /* 2 */ md5tool::ff($c, $d, $a, $b, $x[2], md5tool::s13, 0x242070db); /* 3 */ md5tool::ff($b, $c, $d, $a, $x[3], md5tool::s14, 0xc1bdceee); /* 4 */ md5tool::ff($a, $b, $c, $d, $x[4], md5tool::s11, 0xf57c0faf); /* 5 */ md5tool::ff($d, $a, $b, $c, $x[5], md5tool::s12, 0x4787c62a); /* 6 */ md5tool::ff($c, $d, $a, $b, $x[6], md5tool::s13, 0xa8304613); /* 7 */ md5tool::ff($b, $c, $d, $a, $x[7], md5tool::s14, 0xfd469501); /* 8 */ md5tool::ff($a, $b, $c, $d, $x[8], md5tool::s11, 0x698098d8); /* 9 */ md5tool::ff($d, $a, $b, $c, $x[9], md5tool::s12, 0x8b44f7af); /* 10 */ md5tool::ff($c, $d, $a, $b, $x[10], md5tool::s13, 0xffff5bb1); /* 11 */ md5tool::ff($b, $c, $d, $a, $x[11], md5tool::s14, 0x895cd7be); /* 12 */ md5tool::ff($a, $b, $c, $d, $x[12], md5tool::s11, 0x6b901122); /* 13 */ md5tool::ff($d, $a, $b, $c, $x[13], md5tool::s12, 0xfd987193); /* 14 */ md5tool::ff($c, $d, $a, $b, $x[14], md5tool::s13, 0xa679438e); /* 15 */ md5tool::ff($b, $c, $d, $a, $x[15], md5tool::s14, 0x49b40821); /* 16 */ / round 2 */ md5tool::gg($a, $b, $c, $d, $x[

哪些是考查建网站质量的关键点
购买云服务器选择哪种镜像
虚拟主机 可以换吗
国内云服务器加盟代理哪家好一点
腾讯云服务器有什么优惠活动
极品域名S.co曝出交易 神秘买家究竟何人?
【涨知识】对于网站优化关键词和作弊外链的详细说明
docker命令以及使用注意事项