因为需要php aes加密数据,考虑使用php MD5 输出16位的binary作为密钥。
google 了一下“php MD5 16”? 竟然发现很多文章建议用截取字符串的方式实现,语句如下所示:
<?php echo substr(md5("admin"),8,16); // 16位MD5加密 ?>
?
也许他们需要一个长度是16位的随机字符串, 更可能的是他们理解错了MD5的真正意义。
?
erlang:md5("aaa") . %%输出:<<71,188,229,199,79,88,159,72,103,219,213,126,156,169,248,8>>
从上面的语句可以看出,erlang:md5输出一个16位的binary数据,每一位为8bit,16*8 共128bits。
也就是说MD5输出的是一组,16位(16Byte)128bits的数据。
?
PHP: md5("aaa") //输出:47bce5c74f589f4867dbd57e9ca9f808
?
MD5 binary format and HEX string?format 对照表如下所示:
binary: | 71 | 188 | 229 | 199 | 79 | 88 | 159 | 72 | 103 | 219 | 213 | 126 | 156 | 169 | 248 | 8 |
16进制表示: | 47 | bc | e5 | c7 | 4f | 58 | 9f | 48 | 67 | db | d5 | 7e | 9c | a9 | f8 | 08 |
71 如果用十六进制表示就是47; 188十六进制就是bc , 等等。
?
现在我们来看一看PHP的MD5函数:
?
PHP:md5("aaa")输出的32位长度的字符串:47, bc, e5, c7, 4f, 58, 9f, 48, 67, db, d5, 7e, 9c, a9, f8, 08,
其实相当于将16byte binary 数据用HEX表示出来。 类似于颜色RGB(255,255,255)=>#FF FF FF。
?
PHP:md5("aaa", ture) 输出16byte binary数据。binary数据解析如下所示:?
?
$bin = md5("aaa",ture); for($a=0;$a<strlen($bin);$a++){ echo ord( $bin[$a] ).','; //每一都位打印出来 } //输出:71,188,229,199,79,88,159,72,103,219,213,126,156,169,248,8,
?