問題描述
我使用 1024 RSA 生成了這個測試公鑰,然后在另一個編碼平臺中將其編碼為 DER 和 Base64.我將密鑰復制到 Android/Eclipse 中的字符串中,并嘗試使用 KeyFactory 將其轉換為公鑰.無論我嘗試什么,它都會一直給我一個 InvalidKeySpecException .任何建議都將不勝感激.
I've generated this test public key using 1024 RSA and then encoded it to DER and Base64 in another coding platform. I copied the key into a string in Android/Eclipse and I am trying to turn it into a public key using KeyFactory. It just keeps giving me an InvalidKeySpecException no matter what I try. Any advice at all would be appreciated.
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();
}
}
推薦答案
您擁有的密鑰是 PKCS#1 格式,而不是 Java 接受的 SubjectPublicKeyInfo 結構.PKCS#1 只是 RSA 參數的編碼,缺少諸如算法標識符之類的東西.SubjectPublicKeyInfo 在內部使用 PKCS#1 - 無論如何都用于 RSA 公鑰.
The key you have is in PKCS#1 format instead of SubjectPublicKeyInfo structure that Java accepts. PKCS#1 is the encoding of the RSA parameters only and lacks things such as an algorithm identifier. SubjectPublicKeyInfo uses PKCS#1 internally - for RSA public keys anyway.
由于 PKCS#1 公鑰位于 SubjectPublicKeyInfo 結構的末尾,因此可以簡單地為字節添加前綴,以便它們成為 RSA SubjectPublicKeyInfo.該解決方案更易于執行,無需額外的庫,例如 Bouncy Castle.因此,如果您需要不使用外部庫,那么您可以查看我的答案此處.
As the PKCS#1 public key is at the end of the SubjectPublicKeyInfo structure it is possible to simply prefix the bytes so that they become an RSA SubjectPublicKeyInfo. That solution is easier to perform without additional libraries such as Bouncy Castle. So if you need to go without an external library then you may have a look at my answer here.
或者,可以編寫一個簡單的 BER 解碼器,將結構解碼為兩個 BigInteger 值.結構本身并不復雜但BER/DER長度編碼需要一些時間來適應.
Alternatively a simple BER decoder could be written to decode the structure into the two BigInteger values. The structure itself is not that complicated but the BER/DER length encoding takes some getting used to.
不過,您也可以使用 Bouncy Castle(輕量級 API)來解決您的問題:
However, you can also use Bouncy Castle (lightweight API) to solve your issues:
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);
正如您所見,它實際上只需要一個類作為接口,盡管這當然得到了 Bouncy Castle 中整個 ASN.1/BER 解碼器功能的支持.
As you can see it actually only requires a single class as interface, although that is of course backed up with the entire ASN.1/BER decoder functionality within Bouncy Castle.
請注意,可能需要將 Base 64 解碼器更改為 Android 特定的一個(android.util.Base64
).此代碼已在等效的 Java 運行時測試.
Note that it may be required to change the Base 64 decoder to the Android specific one (android.util.Base64
). This code was tested on an equivalent Java runtime.
這篇關于從字符串創建 RSA 公鑰的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!