几乎没有相关的问题......它是关于在加密中使用的密钥。使用PHP / openssl为AES-CBC-256生成32字节密钥(256位),以便在openssl_encrypt
函数中使用。
据我所知,我可以使用以下php函数创建一个32字节的字符串:
$key = openssl_random_pseudo_bytes(32, true);
第一个问题,它会输出奇怪的字符(我的字符串utf8),这些奇怪的字符是否正确?是否有效使用?
示例输出:O�3sa��TX|~�!�Q8�]M�r��{���?��
如果我将每个字符转换为二进制数字,我得到:
01001111 10110001 00110011 01110011 01100001 10111111 11011101 01010100
01011000 01111100 01111110 11101010 00100001 10001011 01010001 00001110
00111000 10111101 01011101 01001101 10100000 01110010 10101001 11001100
01111011 10110001 11010011 11110001 00111111 00000110 11000110 11001011
所以它似乎是正确的,我得到32x8位= 256位密钥......
第二个问题,就是为什么密钥应该是十六进制的原因之一,因为它可以输出未知字符......这样可以使它更具可读性,也可以用于存储?
$ key_hex = bin2hex($ key);
输出:4fb1337361bfdd54587c7eea218b510e38bd5d4da072a9cc7bb1d3f13f06c6cb
第三个问题,如果我读到HEX它只包含0-9
和A-F
,为什么我在上面的bin2hex
(php)输出中看到小写字符?
然后安全地执行strtoupper()
所以所有人都应该得到大写字符吗?
如果我从原始键中取出第二个字符(未知的字符),即十六进制的b1(B1),即二进制位:10110001
我找到1011 0001
的B1,但似乎是包含2个或更多字节的字符的一部分......这可能是我将其视为未知字符的原因吗?因为它只是一个随机的8位......
也许我在这里错过了一些拼图以获得整体情况......但我认为一般情况下,密钥应该很好,它可以是六角形和大写的,也可以在openssl_encrypt
中使用。
但是我只想确定,我没有犯这个错误,这就是为什么我在这里张贴这个...如果有人可以验证这一点。
谢谢
答案 0 :(得分:6)
1)和2)根据PHP manual,这确实是使用此功能的正确方法。您将注意到,在示例中,bin2hex
用于使字符串可读。
3)两者都有效,在十六进制表示法的上下文中,大写和小写字母之间没有区别。通常,以十六进制作为输入的程序将接受两者,但是......
4)...如果你有一个坚持字母为大写的程序,使用strtoupper
就可以了。