256位密钥的Java AES算法

时间:2020-04-13 17:46:14

标签: java encryption aes

我正在尝试实现AES 256位加密/解密算法。我意识到此算法有多种模式。

https://docs.oracle.com/javase/8/docs/api/javax/crypto/Cipher.html

Every implementation of the Java platform is required to support the following standard Cipher transformations with the keysizes in parentheses:
AES/CBC/NoPadding (128)
AES/CBC/PKCS5Padding (128)
AES/ECB/NoPadding (128)
AES/ECB/PKCS5Padding (128)
DES/CBC/NoPadding (56)
DES/CBC/PKCS5Padding (56)
DES/ECB/NoPadding (56)
DES/ECB/PKCS5Padding (56)
DESede/CBC/NoPadding (168)
DESede/CBC/PKCS5Padding (168)
DESede/ECB/NoPadding (168)
DESede/ECB/PKCS5Padding (168)
RSA/ECB/PKCS1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-1AndMGF1Padding (1024, 2048)
RSA/ECB/OAEPWithSHA-256AndMGF1Padding (1024, 2048)

但是在上面,我没有找到任何具有256位密钥的模式。我有误会吗?

1 个答案:

答案 0 :(得分:1)

AES是具有128位,196位和256位密钥大小的128位块密码。 AES是原始的,它需要mode of operation才能成为加密方案。每种操作模式都可以接受任何密钥大小,并且操作模式与密钥大小无关。

要使用任何模式操作,都需要先实现AES,然后再实现操作模式。根据操作模式,可能只需要加密或解密AES。

某些操作模式

  • 欧洲央行忘了它是不安全的,维基百科中的企鹅。
  • 如果在服务器中使用
  • CBC模式,则容易受到填充oracle攻击。 CBC模式下的Nonce应该为unpredictable
  • CTR模式将块密码转换为流密码,不需要解密AES。仅加密实现就足够了。每个密钥只能使用一次CTR模式的随机数,否则由于the crib dragging attack.
  • ,机密性将失败

以上所有都是古老的操作模式,只有正确使用它们才能提供机密性。

在现代密码学中,我们更喜欢像AES-GCM这样的“身份验证加密(带有关联数据)”模式。这些模式不仅提供机密性,还提供完整性和身份验证。

在GCM模式下,必须谨慎对待IV / Nonce的生成,因为GCM在内部使用CTR模式,并且继承了CTR模式的相同问题,因此切勿在同一密钥下使用同一IV。可以通过使用计数器/ LFSR或在combined mode with random中解决此问题。

此外,GCM中的IV重用可能会导致伪造的灾难性结果。

对于IV重用问题,还有另一种模式在不久的将来成为标准,即SIV模式。 AES-GCM-SIV


Oracle和IBM的Java Cipher具有limited to 128-bit key sizes。这就是为什么您在那边看到128。自2017年8u151起已更改。OpenJDK或BouncyCastle不受限制。