Java >> Java tutorial >  >> Tag >> public

Oprettelse af RSA offentlig nøgle fra streng

Nøglen du har er i PKCS#1-format i stedet for SubjectPublicKeyInfo-strukturen, som Java accepterer. PKCS#1 er kun kodningen af ​​RSA-parametrene og mangler ting såsom en algoritme-id. SubjectPublicKeyInfo bruger PKCS#1 internt – alligevel til offentlige RSA-nøgler.

Da den offentlige nøgle PKCS#1 er i slutningen af ​​SubjectPublicKeyInfo-strukturen, er det muligt blot at præfikse bytes, så de bliver en RSA SubjectPublicKeyInfo. Den løsning er nemmere at udføre uden yderligere biblioteker såsom Bouncy Castle. Så hvis du har brug for at gå uden et eksternt bibliotek, så kan du se mit svar her.

Alternativt kunne en simpel BER-dekoder skrives for at afkode strukturen i de to BigInteger-værdier. Strukturen i sig selv er ikke så kompliceret, men BER/DER-længdekodningen kræver lidt tilvænning.

Du kan dog også bruge Bouncy Castle (letvægts API) til at løse dine problemer:

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);

Som du kan se, kræver det faktisk kun en enkelt klasse som interface, selvom det selvfølgelig er sikkerhedskopieret med hele ASN.1/BER-dekoderfunktionaliteten i Bouncy Castle.

Bemærk, at det kan være nødvendigt at ændre Base 64-dekoderen til den Android-specifikke (android.util.Base64 ). Denne kode blev testet på en tilsvarende Java-runtime.


Java tag