gpt4 book ai didi

java - 从字符串创建 RSA 公钥

转载 作者:搜寻专家 更新时间:2023-10-30 21:10:08 25 4
gpt4 key购买 nike

我使用 1024 RSA 生成了这个测试公钥,然后在另一个编码平台中将其编码为 DER 和 Base64。我将 key 复制到 Android/Eclipse 中的字符串中,并尝试使用 KeyFactory 将其转换为公钥。无论我尝试什么,它都会一直给我一个 InvalidKeySpecException。任何建议都将不胜感激。

     private void prepKeys() {
String AppKeyPub = "MIGHAoGBAOX+TFdFVIKYyCVxWlnbGYbmgkkmHmEv2qStZzAFt6NVqKPLK989Ow0RcqcDTZaZBfO5" +
"5JSVHNIKoqULELruACfqtGoATfgwBp4Owfww8M891gKNSlI/M0yzDQHns5CKwPE01jD6qGZ8/2IZ" +
"OjLJNH6qC9At8iMCbPe9GeXIPFWRAgER";

// create the key factory
try {
KeyFactory kFactory = KeyFactory.getInstance("RSA");
// decode base64 of your key
byte yourKey[] = Base64.decode(AppKeyPub,0);
// generate the public key
X509EncodedKeySpec spec = new X509EncodedKeySpec(yourKey);
PublicKey publicKey = (PublicKey) kFactory.generatePublic(spec);

System.out.println("Public Key: " + publicKey);

} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

最佳答案

您拥有的 key 采用 PKCS#1 格式,而不是 Java 接受的 SubjectPublicKeyInfo 结构。 PKCS#1 只是 RSA 参数的编码,缺少算法标识符等内容。 SubjectPublicKeyInfo 在内部使用 PKCS#1 - 无论如何用于 RSA 公钥。

由于 PKCS#1 公钥位于 SubjectPublicKeyInfo 结构的末尾,因此可以简单地为字节添加前缀,以便它们成为 RSA SubjectPublicKeyInfo。如果没有额外的库(如 Bouncy CaSTLe),该解决方案更容易执行。因此,如果您需要在没有外部库的情况下使用,那么您可以看看我的回答 here .


或者,可以编写一个简单的 BER 解码器来将结构解码为两个 BigInteger 值。结构本身is not that complicated但是 BER/DER 长度编码需要一些时间来适应。

不过,您也可以使用 Bouncy CaSTLe(轻量级 API)来解决您的问题:

String publicKeyB64 = "MIGHAoGBAOX+TFdFVIKYyCVxWlnbGYbmgkkmHmEv2qStZzAFt6NVqKPLK989Ow0RcqcDTZaZBfO5"
+ "5JSVHNIKoqULELruACfqtGoATfgwBp4Owfww8M891gKNSlI/M0yzDQHns5CKwPE01jD6qGZ8/2IZ"
+ "OjLJNH6qC9At8iMCbPe9GeXIPFWRAgER";
// ok, you may need to use the Base64 decoder of bouncy or Android instead
byte[] decoded = Base64.getDecoder().decode(publicKeyB64);
org.bouncycastle.asn1.pkcs.RSAPublicKey pkcs1PublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(decoded);
BigInteger modulus = pkcs1PublicKey.getModulus();
BigInteger publicExponent = pkcs1PublicKey.getPublicExponent();
RSAPublicKeySpec keySpec = new RSAPublicKeySpec(modulus, publicExponent);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey generatedPublic = kf.generatePublic(keySpec);
System.out.printf("Modulus: %X%n", modulus);
System.out.printf("Public exponent: %d ... 17? Why?%n", publicExponent); // 17? OK.
System.out.printf("See, Java class result: %s, is RSAPublicKey: %b%n", generatedPublic.getClass().getName(), generatedPublic instanceof RSAPublicKey);

如您所见,它实际上只需要一个类作为接口(interface),尽管这当然得到了 Bouncy CaSTLe 中整个 ASN.1/BER 解码器功能的支持。


请注意,可能需要将 Base 64 解码器更改为 the Android specific one (android.util.Base64) .此代码在等效的 Java 运行时上进行了测试。

关于java - 从字符串创建 RSA 公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33425446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com