从字符串创建RSA公钥

轴心

我已经使用1024个RSA生成了该测试公钥,然后在另一个编码平台中将其编码为DER和Base64。我在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(); 
            }

         }
Maarten Bodewes:

您拥有的密钥采用PKCS#1格式,而不是Java接受的SubjectPublicKeyInfo结构。PKCS#1仅是RSA参数的编码,缺少诸如算法标识符之类的东西。SubjectPublicKeyInfo在内部使用PKCS#1-始终用于RSA公钥。

由于PKCS#1公钥位于SubjectPublicKeyInfo结构的末尾,因此可以简单地为字节添加前缀,以使它们成为RSA SubjectPublicKeyInfo。如果没有诸如Bouncy Castle之类的其他库,该解决方案将更易于执行。因此,如果您不需要外部库,则可以在这里查看我的答案


或者,可以编写一个简单的BER解码器以将结构解码为两个BigInteger值。结构本身并不复杂,但是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);

如您所见,它实际上只需要一个类作为接口,尽管它当然由Bouncy Castle中的全部ASN.1 / BER解码器功能支持。


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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章