2014-05-19 43 views
1

得到了几个相互关联的问题......它是关于密钥用于加密。使用PHP/openssl为AES-CBC-256生成32字节密钥(256位),以便在openssl_encrypt函数中使用。openssl随机伪字节和具有小写字符的bin2hex

按我的理解,我可以创造一个32字节的字符串,用下面的PHP函数:

$key = openssl_random_pseudo_bytes(32, true); 
  1. 第一个问题,它会输出奇怪的字符(我的字符集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 
    

    所以它似乎是正确的,我得到了32×8位= 256位密钥...

  2. 第二个问题,是密钥应该被hex'ed的原因之一,因为它可以输出未知的字符......这种方式使它更易读,也用于存储?

    $ key_hex = bin2hex($ key);

    输出:4fb1337361bfdd54587c7eea218b510e38bd5d4da072a9cc7bb1d3f13f06c6cb

  3. 第三个问题,如果我读到HEX它说,它仅包含0-9A-F,为何会出现小写字符在bin2hex(PHP)上面的输出?

  4. 是否安全,然后做strtoupper()所以都得到大写字符,因为它应该?

    如果我把第二个字符(未知的)从原始密钥,这是十六进制B1(B1),即二进制位:10110001

    如果我看它这个网站上:http://dev.networkerror.org/utf8/?start=0&end=400&cols=4&search=&show_uni_int=on&show_uni_hex=on&show_html_ent=on&show_raw_hex=on&show_raw_bin=on

    我确实发现了B1为1011 0001,但似乎是包含2个或更多字节的字符的一部分......这可能是我将其视为未知字符的原因吗?因为它只是一个随机的8位...

    也许我错过了一些拼图在这里得到整体图片......但我认为一般来说钥匙应该罚款,它可以hex'ed和uppercased也可用于openssl_encrypt

    而只是希望可以肯定,我不会让任何这方面的错误,这就是为什么我在这里张贴这...如果有人可以证实这一点。

谢谢

+0

一般来说,答案是“是”:)请注意,您可以生成任何字符编码,包括无效字符编码。它取决于PHP中使用的默认字符编码。你得到的是一个八位字符串(或字节数组),而不是一个字符串,但由于PHP不是强类型的,它可以用作任何一种。 –

+0

你误解了第二个参数。它对函数的结果没有影响。你传入一个像'$ cryptoStrong'这样的变量,函数将通过reference_设置该变量的值。然后您可以检查该值以查看字节生成是否具有密码强度。 – Madbreaks

回答

6

1)和2)按照PHP manual,这确实是使用该功能的正确方法。您会注意到在该示例中,bin2hex用于使字符串可读。

3)两者都是有效的,在十六进制符号的上下文中,大小写字母没有区别。一般来说,一个以十六进制为输入的程序将同时接受这两个字符,但是...

4)...如果你有一个坚持字母大写的程序,使用strtoupper将起作用。