【问题标题】:Java DerInputStream.getLength(): lengthTag=109Java DerInputStream.getLength():lengthTag=109
【发布时间】:2021-02-18 16:29:24
【问题描述】:

我正在尝试从文件加载私钥,然后使用此私钥获取模数和指数。但是当我创建私钥时,出现以下错误:

java.security.spec.InvalidKeySpecException:java.security.InvalidKeyException:IOException:DerInputStream.getLength():lengthTag=109,太大。 在 java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:250) 在 java.base/java.security.KeyFactory.generatePrivate(KeyFactory.java:390) 在 Client.main(Client.java:58) 引起:java.security.InvalidKeyException:IOException:DerInputStream.getLength(): lengthTag=109,太大了。 在 java.base/sun.security.pkcs.PKCS8Key.decode(PKCS8Key.java:133) 在 java.base/sun.security.pkcs.PKCS8Key.(PKCS8Key.java:94) 在 java.base/sun.security.rsa.RSAPrivateCrtKeyImpl.(RSAPrivateCrtKeyImpl.java:130) 在 java.base/sun.security.rsa.RSAPrivateCrtKeyImpl.newKey(RSAPrivateCrtKeyImpl.java:85) 在 java.base/sun.security.rsa.RSAKeyFactory.generatePrivate(RSAKeyFactory.java:355) 在 java.base/sun.security.rsa.RSAKeyFactory.engineGeneratePrivate(RSAKeyFactory.java:246) ... 2 更多

这是我获取文件名并尝试创建私钥的代码。

byte[] keyBytes = Files.readAllBytes(Paths.get(output+".prv"));
PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory rsaFact = KeyFactory.getInstance("RSA");
        RSAPrivateKey key = (RSAPrivateKey) rsaFact.generatePrivate(spec);

output.prv,输出是用户名,.prv 是用不同方法创建的文件类型,它会自动生成密钥。我只想从文件中获取私钥。

这是从其他文件生成的密钥

SunRsaSign RSA private CRT key, 2048 bits
params: null

 modulus: 18084100169983149427066482527604115746190219078189234105203625326412760751210703298115063502298186511066239351114969324553879550391327154377587706062971324999459293277427867723772543991811325841765280665439097010290220945299964041074424240275807775652203588398158621625667076399388107776579829026844381635271039680795179509425842635409982862232922158074095170776431141412596599683031473368650600492082930092439720107233068168026832652353420501942453862260408347057156619733497039885468915234561425093650221644249373913108527900535389930734873554925693784673505692243026885455606070479910344434901259082575943448959779

private exponent: 12841292241184458014364296464395879190082765845883888300560921491909465600791804620052500270174873821894343358451520934079434405550470601084422525856424562483785298857922405362790528705111977519542103946282851787049697302766748959816294320303267870905390823401820464387958996206697352207130254717522269682173363746267525476965078058033366333877304865058976851114190836350093363759569164389007627774273603200327643820232553479155125421781107349834029404115646012972640582500098078887754339093154204134258421766428473216528531352682353113256728328028902309568767490774074390452849891054091134627576057810041899256811593

谢谢大家

【问题讨论】:

  • 您是否因为旧帐户被问题禁止而创建了新帐户?那是气馁!上下文:stackoverflow.com/questions/66261958 话虽这么说:您的prv文件是如何创建的,它的内容是什么?不要共享机密密钥,而是生成一个可用于正确测试/试验代码的虚拟密钥。
  • .prv 是由讲师给我使用的一些代码创建的,然后问题是使用此文件中的密钥来加密消息。这就是我想要做的。
  • 代码本身有效。密钥已损坏或密钥的格式/编码与代码不匹配,这需要 DER 编码的 PKCS#8 密钥。检查您的密钥是否满足此要求(或共享 test 密钥)。
  • 我刚刚编辑了帖子,更新了密钥生成和从其他类生成的示例密钥
  • 这是关键文件内容吗?无论如何,显然给出了模数和私有指数。然后您可以使用RSAPrivateKeySpec 代替PKCS8EncodedKeySpec,并将模数和私有指数作为BigInteger 传递。

标签: java cryptography rsa private-key


【解决方案1】:

我只想对此发表评论,但由于我也不被允许,我将提出一个答案并说: 你看过this线程吗?

编辑:错字

【讨论】:

    猜你喜欢
    • 2014-06-01
    • 1970-01-01
    • 2019-05-15
    • 2016-10-22
    • 1970-01-01
    • 2021-10-27
    • 2018-03-22
    • 2019-07-08
    • 2011-11-15
    相关资源
    最近更新 更多