将"AES"指定为KeyGenerator.getInstance()中的算法究竟做了什么?

d60*_*402 5 java encryption cryptography aes key-generator

我很困惑为什么在生成加密密钥时需要指定一个算法,如"AES" ,例如..

KeyGenerator kg = KeyGenerator.getInstance("AES");
Run Code Online (Sandbox Code Playgroud)

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

kg.init(256, new SecureRandom());
SecretKey key = kg.generateKey();
Run Code Online (Sandbox Code Playgroud)

对于它的价值,上面的示例代码来自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");
Run Code Online (Sandbox Code Playgroud)

...表示要使用的密码算法是必要的.我只是没有得到为密钥生成指定它的目的.

谢谢.

Maa*_*wes 3

正如评论中提到的,除 AES 之外的其他密钥可能需要更多关注。DES 和 AES 最好采用对称方法,以便您可以在算法之间切换。

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