【发布时间】: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