7

我很困惑为什么在生成加密密钥时需要指定诸如“AES”之类的算法,例如..

KeyGenerator kg = KeyGenerator.getInstance("AES");

它显然不用于指定密钥的大小,因为 AES 密钥可以是 128、192 或 256 位。那部分将通过 init() 完成...

kg.init(256, new SecureRandom());
SecretKey key = kg.generateKey();

值得一提的是,上面的示例代码是从http://android-developers.blogspot.de/2013/02/using-cryptography-to-store-credentials.html借来的

此外,NIST FIPS-197 指出...

AES算法没有识别出弱密钥或半弱密钥,并且对密钥选择没有限制。

...所以这会让我相信任何128、192 或 256 位都可以用作密钥。

显然,当我得到一个密码实例时指定“AES”,例如..

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");

...必须指明要使用的密码算法。我只是不明白为密钥生​​成指定它的目的是什么。

谢谢。

4

1 回答 1

3

如评论中所述,AES 以外的其他密钥可能需要更多关注。最好有一个对称的 DES 和 AES 方法,这样你就可以在算法之间切换。

此外,并非所有密码提供者都可以在内存中创建密钥。Java JCA 还与硬件密钥存储兼容。对于 PKCS#11 提供程序(例如),需要在生成密钥时知道密钥的类型。

于 2014-06-10T00:52:11.237 回答