【问题标题】:Java public key sizeJava 公钥大小
【发布时间】:2014-09-15 13:19:02
【问题描述】:

为了与服务进行互操作,我必须使用 RSA 加密一些值,其密钥大小似乎小于 Java 上的最小 512 位。有什么办法可以放宽这个政策?

BigInteger e = new BigInteger("13082845549543033994073971762152947067", 10);
BigInteger m = new BigInteger("229110545576645850236522690668306544921", 10);

RSAPublicKeySpec spec = new RSAPublicKeySpec(m, e);
KeyFactory keyFac = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFac.generatePublic(spec);

// ^^^^ java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: RSA keys must be at least 512 bits long

【问题讨论】:

  • 我不得不质疑这种努力的意义 - RSA 512 位已经很容易破解(请参阅 this),那是 10 多年前的事了 - 现在它不会接近那个长。我想您可以使用大量反射来消除任何此类限制,或者可能找到一个允许此类事情的不同 JVM,甚至可能实现您自己的 RSA 套件,但这些都无助于底层安全问题。
  • 我必须与这个系统互操作。它的设计非常糟糕,带有自签名密钥和不匹配的主机名。但是程序员必须做他/她必须做的事情。

标签: java encryption rsa public-key


【解决方案1】:

我检查了你的代码,结果如下:

SunPKCS11-NSS RSA public key, 128 bits (id 1, session object)
modulus: 229110545576645850236522690668306544921
public exponent: 13082845549543033994073971762152947067

异常究竟发生在哪里?

【讨论】:

  • 它发生在generatePublic 调用上,作为参考,bitcount(e): 64 bitcount(m): 49
  • @wingleader:bitcount 不是有趣的数量,bitLength 才是。
【解决方案2】:

您可以使用 BouncyCastle 提供程序。只需在您的代码前面加上

java.security.Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());

换行

KeyFactory keyFac = KeyFactory.getInstance("RSA");

进入

KeyFactory keyFac = KeyFactory.getInstance("RSA", "BC");

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2020-04-07
    • 2012-11-24
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多