生成加密密钥的不同方法有哪些

What are the different ways of generating a key for encription

我正在使用带有 php 的 aes256 来加密数据。
在各种文档中,我看到了各种生成密钥的方法,例如:

$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

$Key = "what ever, plain string";

或者

$Key = "123456789abcdef";//128bit

与其他示例相比,第一个示例的意义何在? 为什么不简单地使用 128 或 256 长的随机字符串?

我将此处的示例 http://php.net/manual/en/function.mcrypt-encrypt.php 与上述每种不同的密钥生成方法一起使用。

您有三种不同的密钥长度。 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版本的key。这不是 AES 中密钥的有效长度。 MCrypt 将用 [=15=] 填充密钥直到下一个有效密钥大小,对于 AES-192 为 24 字节。所以这个密钥实际上是 PHP 5.6 的有效密钥,形式为:

$Key = "what ever, plain string[=12=]";

$Key = "123456789abcdef"; //128bit

这是 15 个字符 "key"。与前面的示例一样,它将被填充到 16 个字节,以便使用 AES-128。

正在生成密钥

由于您询问的是密钥生成,this question 包含一些方法。密钥应该是随机的并且由所有可能的字节组成。如果您想安全地防止对您的密钥的暴力攻击,使用仅包含字母数字或仅包含可打印字符的密钥是不好的。

由于无法直接将任意字节硬编码为代码文件中的密钥,因此您应该使用第一种方法对密钥的编码版本进行硬编码并以编程方式对其进行解码。

使用硬编码密钥

只有少数几种情况可以在代码中使用硬编码对称密钥:

  • 测试加密实现(开发期间)
  • 静态加密数据,其中数据与加密密钥不在同一台机器上(否则,它只是数据混淆)

如果您的场景与上述情况不符,您要么对混淆感到满意,要么应该考虑如何使用 public-key-encryption 和混合加密方法。