【问题标题】:Can I use 4096 bits as key length for java RSA with OAEP padding?我可以使用 4096 位作为带有 OAEP 填充的 java RSA 的密钥长度吗?
【发布时间】:2018-08-06 23:57:11
【问题描述】:

我正在使用 RSA 加密 AES 密钥和其他一些信息。为了不受 padding-oracle-attack 的攻击,我用以下方式实例化我的 Cipher:

Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");

现在在 Oracle 文档(我正在使用 oracle-java)中给出了密钥长度:https://docs.oracle.com/javase/7/docs/api/javax/crypto/Cipher.html

对于RSA/ECB/OAEPWithSHA-256AndMGF1Padding,它声明 1024 和 2048 位。这是否意味着我不能或不应该使用密钥长度为 4096 的密码?以下是我生成密钥的方式:

KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
keygen.initialize(4096, SecureRandom.getInstanceStrong());
KeyPair keyPair = keygen.genKeyPair();

我可以将此密钥与RSA/ECB/OAEPWithSHA-256AndMGF1Padding 一起使用吗?

【问题讨论】:

  • 它只是说 Java 保证支持 1024 和 2048 位密钥大小。它不禁止支持其他密钥大小。
  • 好的谢谢!这是我所希望的,只是想确保

标签: java security cryptography rsa


【解决方案1】:

是的,您可以将它与该密钥大小一起使用,并且大多数 Java 提供程序(包括为大多数运行时默认提供的提供程序)都能够处理它。

这两种密钥大小——其中 1024 不应再使用,而 2048 被认为相当小——只需要由任何官方 Java 运行时提供的默认提供程序支持。然而,软件实现通常可以处理高达 16Ki 位的密钥大小(即 16 乘以 1024 或 16 kibi位,以防您不熟悉该术语)。

RSA / OAEP 已指定用于任何 密钥大小。但是,大多数实现要求位大小是 8 的倍数(以简化位/字节转换),有些需要 32 位增量(以简化使用 32 位整数的实现),有些甚至要求您使用 n 形式的密钥大小= 2^x 或 n = 2^x + 2^(x-1)。显然也需要某种最小值来支持填充方案,因此 512 通常是一个下限。一些实现过度保护并不允许密钥大小小于(有时包括)1024 位。

因此,由于您的密钥格式为 2^x(当然 x = 12),因此完全可以使用它,并且密钥大小极不可能不被支持。 (最新?)1.7 版本也不需要无限加密扩展,因此您无需担心。


某些硬件模块对密钥大小有严格的限制。例如,如果智能卡可以管理 4096 位密钥,它们几乎无法管理它们。

对于这些用途,您可能需要考虑使用椭圆曲线密码术。在这种情况下,您需要加密,因此使用 Certicom secp256r1(也称为 NIST P-256)依赖 ECDH 的 ECIES 将是一种可行且更安全的替代方案(直到量子计算成熟,在这种情况下,您会比使用RSA 替代方案)。

【讨论】:

    猜你喜欢
    • 2019-01-26
    • 2017-08-21
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 2014-05-23
    • 2018-04-05
    • 1970-01-01
    • 2013-07-16
    相关资源
    最近更新 更多