2016-10-20 5 views
1

문자열에서 RSA 공개 키를 만들려고합니다. 나는 아래에 언급 된 예외를 얻는다. Android에서 생성 된 키 (문자열, Swift 사용)를 확인하려고합니다. 문자열을 개인/공개 키로 변환하는 방법은 무엇입니까? IOS에서Android : InvalidKeySpecException : 인코딩 된 키 사양이 인식되지 않습니다.

static PublicKey getRSAPublicKeyFromString (String publicKeyPEM){ 
    try { 
     KeyFactory keyFactory = KeyFactory.getInstance("RSA", "SC"); 
     byte[] publicKeyBytes = Base64.decode(publicKeyPEM.getBytes("UTF-8"), Base64.DEFAULT); 
     X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyBytes); 
     return keyFactory.generatePublic(x509KeySpec); 
    }catch (Exception e){ 
     e.printStackTrace(); 
    } 

    return null; 
} 

예외

java.security.spec.InvalidKeySpecException: encoded key spec not recognised 
at org.spongycastle.jcajce.provider.asymmetric.util.BaseKeyFactorySpi.engineGeneratePublic(BaseKeyFactorySpi.java:52) 
at org.spongycastle.jcajce.provider.asymmetric.rsa.KeyFactorySpi.engineGeneratePublic(KeyFactorySpi.java:130) 
at java.security.KeyFactory.generatePublic(KeyFactory.java:172) 

공개 키 :

MIGJAoGBAOibWF15OhLJQAWpQN++UFqyG+2uLEG8PPvCajwwh6FWi6jLiZ9VN+l3JpiJTQwF/yxlSJCZCoYnljKeRBnNxpzBnuTJsyuZ4hI8ehLzDvh9nYzX/TlcZYVshJzyIVRZAbuFOCLNIltjB+Qmw8YGlxzeDSFaB6eEC1OP49hDakURAgMBAAE= 

답변

0

불행하게도 당신이해야하는 것은 자바가 생산하거나 소비하지 않는 무언가이다 PKCS#1 RSAPublicKey을 base64로 인코딩 된이있다. 자바는 조금 더 일반적이고 약간 더 복잡하다. X.509 SubjectPublicKeyInfo을 생성하고 소비한다.

import org.bouncycastle.asn1.ASN1InputStream; 
import org.bouncycastle.asn1.ASN1Primitive; 

import java.security.KeyFactory; 
import java.security.PublicKey; 
import java.security.spec.RSAPublicKeySpec; 
import java.util.Base64; 

public class Main { 

    public static void main(String[] args) throws Exception { 
     String pubkey64 = "MIGJAoGBAOibWF15OhLJQAWpQN++UFqyG+2uLEG8PPvCajwwh6FWi6jLiZ9VN+l3JpiJTQwF/yxlSJCZCoYnljKeRBnNxpzBnuTJsyuZ4hI8ehLzDvh9nYzX/TlcZYVshJzyIVRZAbuFOCLNIltjB+Qmw8YGlxzeDSFaB6eEC1OP49hDakURAgMBAAE="; 
     PublicKey rsaPub = readRSAPublicKey(pubkey64); 
     System.out.println(rsaPub); 
    } 

    private static PublicKey readRSAPublicKey(String pubkey64) throws Exception { 
     byte [] derRsaPubBytes = Base64.getDecoder().decode(pubkey64); 
     ASN1Primitive asn1Prime = new ASN1InputStream(derRsaPubBytes).readObject(); 
     org.bouncycastle.asn1.pkcs.RSAPublicKey rsaPub = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(asn1Prime); 
     KeyFactory kf = KeyFactory.getInstance("RSA"); 
     return kf.generatePublic(new RSAPublicKeySpec(rsaPub.getModulus(), rsaPub.getPublicExponent())); 
    } 
} 
+0

나는이 문제에 능통 아니에요 다음 Bouncycastle 라이브러리를 사용하여

, 여기 RSAPublicKey을 생산하는 몇 가지 예제 코드입니다. 내 공기를 고치는 아이디어를 줄 수 있니? –

+0

고맙습니다, pkcs # 1로 공개/개인 키를 생성하는 방법을 보여 주시겠습니까? –