2015-01-29 5 views
2

Android에서 비대칭 공개/개인 키 암호화를 사용하여 메시지를 필사적으로 암호화하려고합니다.공개 키를 사용하는 InvalidKeySpecException

저는 Windows에 있는데 puttygen을 사용하여 공개 키와 개인 키를 생성했습니다. 어떤 차이가 있는지 모르겠지만 SSH-2 RSA를 선택했습니다. 공개 키는 다음과 같습니다.

AAAAB3NzaC1yc2EAAAABJQAAAQEAh63orUzl0UTd7jj0KNYJg1+kNnty0QHyJu0r 
Cajf5Kl7qWJaGXPfwsG8Qt3teafs5sv0JBSinab0s/5wfQmd1QPpXTMP93Wc4ucp 
1VC/9B2o8XVi4fKoGTehB48yrSfI6KF2AIeASM1jUswydKxsuS4AS2mLGV/HuoKD 
huMfCsRc8qK5zGQfVCoZTbQ66Z1yKdAzxMUuGmiTp7pVsle/P/UGbm6yFiee5r1/ 
dOR2CDyR6CP09Jaj7KSGfGuwPryCXPjEce1oCbN/FlLHVb7T1B5f6xhq+oY+Ij13 
1IZPfShV8cs2kYKjsle2s23V5urSdWFv2tEcSJcpkUm2FlPdQw== 

본인을 기본/자산 폴더의 텍스트 파일에 복사했습니다. 그래서 같이 이것을 판독 :

InputStream input = context.getAssets().open(filename); 

이 후 상당히있는 ByteArrayOutputStream 표준 방법을 통해 바이트 배열에 판독된다.

그때 시도하고 같은 공개 키에 그 변환 :

public static PublicKey getPublicKey(byte[] keyBytes){ 
    PublicKey publicKey = null; 

    if(keyBytes != null) { 

     X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes); 
     KeyFactory kf = null; 
     try { 
      kf = KeyFactory.getInstance("RSA"); 
      publicKey = kf.generatePublic(spec); 
     } catch (NoSuchAlgorithmException e) { 
      Log.e(TAG, "NoSuchAlgorithmException"); 
      e.printStackTrace(); 
     } catch (InvalidKeySpecException e) { 
      Log.e(TAG, "InvalidKeySpecException " + e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 

    return publicKey; 
} 

문제는 내가이 오류가 계속입니다 :

InvalidKeySpecException java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 

나는 시간이 공격 봤는데, 그리고 수 주위를 둘러 보지 않는 것 같습니다. 제발 제안을 환영하십시오. 차이가 없습니다

byte[] tempNewKey = Base64.decode(keyBytes, Base64.DEFAULT); 

을하고 또한

RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(new BigInteger(module), new BigInteger(exponent)); 

그러나 퍼티 나에게 지수에 대해 아무것도 말하지 않는 사용하여 시도했다 :

나는 같은 Base64로 시도했습니다? 이 방법을 계속 사용하면 같은 오류가 발생하지 않지만 개인 키를 사용하여 암호를 해독하려고하면 횡설수설합니다.

정말 도움이되기를 바랍니다. 많은 감사합니다

+0

SSH 키를 사용해야합니까? SSH 키는 X509로 인코딩되어 있지 않으므로 SSH 호환 라이브러리를 사용하지 않는 것이 좋습니다. 영원히 노력하고 ... 당신은 자바 자체에서 키를 생성 할 수도 있고 아니면 OpenSSL DER 인코딩을 사용할 수도 있습니다 열쇠. –

+0

안녕 Maarten, 도와 줘서 고마워. 아니, SSH를 사용할 필요가 없으며 모든 개인/공개 키가 수행합니다. keytool -genkey 등을 사용하여 키를 만들려고했는데 작동하는 것처럼 보였지만 내 코드의 오류는 여전히 동일합니까? – James

+0

다소 일반적인 예외입니다. 더 많은 정보가 없으면 * 이번에는 오류의 원인이 무엇인지 알기가 어렵습니다. 잠깐,이 질문에 답하고 새 질문을 할 수 있습니다. 그렇지 않으면 질문이 구체적이지 않을 것입니다. –

답변

0

SSH 키는 X509 호환 키가 아닙니다. SSH 독점 형식으로 저장됩니다. 키 값을 검색하려면 SSH 가능 라이브러리가 필요합니다.

SSH 기능은 다음 필요하지 않은 경우가 keytool 명령 줄이나 KeyPairGenerator를 사용하여 (자바에서 키를 생성 할 수 있습니다.

은 또한이 같은 openssl 명령 줄 같은 외부 애플리케이션이나 라이브러리를 사용하는 것도 가능하다. OpenSSL의 경우 DER을 출력으로 지정하십시오. Java는 X509EncodedKeySpec에 대해 DER로 인코딩 된 SubjectPublicKeyInfo 구조를 기대합니다.