2014-10-31 223 views
0

我在许多PHP示例代码中看到用于加密的密钥是使用pack()转换为Hex的。将密钥转换为二进制以进行加密

$binaryKey = pack('H*', $key) 

我创建使用mcrypt的功能来加密和不转换字符串键解密两种方法,并测试了,没有任何问题。 我是否错过了将密钥转换为十六进制的内容?

+2

在这种情况下,您正在使用不同的密钥。您的密钥大小为n * 2,字母表由16个符号组成,而“pack-version”使用大小为n的密钥,并且其字母表每个字符有256个符号。 – VolkerK 2014-10-31 15:30:02

回答

1

的关键是转变六角使用pack method.If你不这样做,那么你的密钥包含每字节的一半之多熵(随机性)为二进制。例如,一个128位的密钥将被延伸到128位熵的256位密钥。 AES-128会变成AES-256,所以会使用稍微不同的算法。

PHP的mcrypt使检测这种事情相当棘手,因为它会接受任何大小的关键。它只会增加零,直到找到它可以使用的密钥长度,并且如果超过256位(对于AES),那么它将在第一个32之后删除任何字节。密码学家认为这是非常糟糕的做法。所以在你的情况下,一个256位的密钥可能会被拉伸到512位,之后只能被剪切为256位。您的密钥将只包含256位密钥的低128位,十六进制!

所以,如果你有一个很好的192或256位密钥,是的,你会错过一些关键信息。此外,您可能会遇到兼容性问题,并在以后遇到非常生气的同事。

相关问题