Java 256 位密钥的 AES 算法

Java AES algorithm for 256 bit key

我正在尝试实现 AES 256 位 encryption/decryption 算法。我意识到这个算法有多种模式。

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位密钥的模式。我弄错了什么吗?

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

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

一些操作模式

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

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

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

在 GCM 模式下,必须注意 IV/Nonce 生成,因为 GCM 内部使用 CTR 模式并且它继承了与 CTR 模式相同的问题,因此不要在相同的密钥下使用相同的 IV。可以通过使用 counter/LFSR 或 combined mode with random.

来解决这个问题

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

对于IV复用问题,还有一种模式正在成为近期的标准,就是SIV模式; AES-GCM-SIV.


Java Oracle和IBM的密码有limited to 128-bit key sizes。这就是为什么你在那里看到 128 的原因。 2017年8u151后改版,不限OpenJDK或BouncyCastle