【问题标题】:Java AES algorithm for 256 bit key256位密钥的Java AES算法
【发布时间】:2020-07-26 08:21:21
【问题描述】:

我正在尝试实现 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 位密钥的模式。我有什么误解吗?

【问题讨论】:

  • 不清楚。你想使用这个库还是你想实现你的 AES?另外,为什么需要 Java 8?
  • @kelalaka 使用 Java 库实现 256 位密钥的 AES 加密解密。
  • 我写了一个简短的答案,确实可能很长。有什么不清楚的,请指出。
  • 文档指定了最小值。所有当前的 Java 版本都实现了超过最低要求,特别是使用 192 位和 256 位密钥以及 128 位实现 AES。

标签: java encryption aes


【解决方案1】:

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

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

一些操作模式

  • ECB 忘记了它是不安全的,请参阅 Wikipedia 中的 the ECB penguin
  • 如果在服务器中使用 CBC 模式,则容易受到 padding oracle 攻击。 CBC模式下的Nonce应该是唯一的并且unpredictable
  • CTR 模式将分组密码转换为流密码,不需要解密 AES。只有加密实现就足够了。 CTR 模式下的 nonce 每个密钥只能使用一次,否则由于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 密码有 limited to 128-bit key sizes。这就是为什么你在那边看到 128。从 2017 年 8u151 开始更改。OpenJDK 或 BouncyCastle 不限。

【讨论】:

  • 谢谢我没有得到所有。不过现在我明白了。提到的位数是针对块的,与加密的大小无关。所以无论我选择哪种模式,我都可以使用 256 位密钥。如果我错了,请纠正我
  • 好吧,Java has limited to 128-bit key sizes。这就是为什么你在那边看到 128。是的,操作模式与密钥大小无关。请注意,块大小会产生影响,就像 GCM 模式仅定义为 128 位块大小一样。
  • 只有 Oracle 和 IBM 版本(不是 OpenJDK)受“有限加密策略”(最大 128 位)的约束,并且仅在 2017 年 8u151 之前。从那时起 256 位就可以了,正如对您链接的 Q 的正确评论。如果您确实在 Java 中使用 GCM,请注意它会将密文 + 标记组合成 API 上的一个“blob”,这与许多其他 API(如果不是大多数其他 API)不同。
  • @dave_thompson_085 谢谢。这种有限的加密政策是否是由于美国的要求?
  • 肯定是在 1990 年代后期,Sun 最初将加密添加到 Java 中(除了签名,它不受限制,对 Java 的从网络运行的概念至关重要)。从那以后的几年里,美国的法律限制已经分几个阶段放松了,特别是对于 IIRC Java 在 j7 期间正式成为的开源软件,所以如果甲骨文有动力的话,他们可能会在几年前解决这个问题。
猜你喜欢
  • 2013-06-16
  • 1970-01-01
  • 2014-06-15
  • 1970-01-01
  • 2010-11-02
  • 2017-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多