您有三种不同的密钥长度。AES 规定了以下三种密钥长度:128 位(16 字节)、192 位(24 字节)和 256 位(32 字节)。我不会详细介绍不同密钥大小的强度。
让我们把它们分开:
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
这是一个十六进制编码,编码形式为 64 个字符。密钥本身将是 32 字节长,这意味着当密钥传递给mcrypt_encrypt()
AES-256 时会自动使用。
$Key = "what ever, plain string";
这是一个 23 个字符的字符串,可用作 5.6.0 之前的 PHP 版本的键。这不是 AES 中密钥的有效长度。\0
MCrypt 将使用AES-192 的 24 字节的下一个有效密钥大小填充密钥。所以这个键实际上是 PHP 5.6 的有效键,形式如下:
$Key = "what ever, plain string\0";
$Key = "123456789abcdef"; //128bit
这是一个 15 个字符的“键”。与前面的示例一样,它将被填充到 16 个字节,以便使用 AES-128。
生成密钥
由于您要询问密钥生成,因此此问题包含一些方法。密钥应该是随机的并且由所有可能的字节组成。如果您想安全地防止对您的密钥进行暴力攻击,那么使用仅包含字母数字或仅包含可打印字符的密钥并不好。
由于不可能将任意字节直接硬编码为代码文件中的密钥,因此您应该使用第一种方法对密钥的编码版本进行硬编码并以编程方式对其进行解码。
使用硬编码键
只有少数情况可以在代码中硬编码对称密钥:
- 测试加密实现(在开发期间)
- 静态加密数据,其中数据与加密密钥不在同一台机器上(否则,它只是数据混淆)
如果您的方案与上述不匹配,您要么对混淆感到满意,要么您应该考虑如何通过混合加密方法使用公钥加密。