AES随机密钥生成

Mic*_*tti 2 java encryption cryptography aes

我看到许多以这种方式生成密钥的示例:

KeyGenerator generator = KeyGenerator.getInstance("AES");
generator.init(KEY_LEN);
SecretKey secretKey = generator.generateKey();
Run Code Online (Sandbox Code Playgroud)

我怀疑是否存在以下差异(甚至是概念上的):

byte[] material = new byte[KEY_LEN / Byte.SIZE];
SecureRandom.getInstanceStrong().nextBytes(material);
SecretKey secretKey = new SecretKeySpec(material, "AES");
Run Code Online (Sandbox Code Playgroud)

说这两种方法都是3行,是否有一些实际影响,优先选择第一种?

谢谢

Jam*_*olk 5

您可以查看实际的源代码generateKey()以查看差异,但最终他们将执行相同的步骤来生成AES密钥.我会争辩后者

byte[] material = new byte[KEY_LEN / Byte.SIZE];
SecureRandom.getInstanceStrong().nextBytes(material);
SecretKey secretKey = new SecretKeySpec(material, "AES");
Run Code Online (Sandbox Code Playgroud)

对于普通编码器来说,它更脆弱一点,要求他们理解SecureRandom类.如果你完全消除了第二行,那么代码就可以使用全零键运行,这是一个明显的漏洞,攻击者也很容易检查.此外,generateKey()如果算法有一些特殊要求,使用可以生成格式正确的密钥.例如,现在过时的DES和Triple DES算法在每个字节中都有一个奇怪的奇偶校验位,这是某些DES实现期望看到的.