2011-01-19 11 views
3

Java에서 JavaME로 인스턴스 메시징 응용 프로그램을 이식하는 중입니다.이 애플리케이션도 암호화를 구현합니다. 문제는 서버에 공개 키를 보내려고한다는 것입니다. 데스크톱 클라이언트는이 작업이 코드가 있습니다RSA 공개 키, javaME, bouncy castle을 전송하는 중 문제가 발생했습니다.

byte[] encoded_public_key=publick_key.getEncoded(); 

를 그리고 서버는 키를 검색하기 위해이 코드를 가지고 :

EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encoded_public_key); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey puKey = keyFactory.generatePublic(publicKeySpec); 

지금 나는의 getEncoded API를 검토 한 결과 그것은 말한다 바이트 배열로 키의 DER로 인코딩 된 형식을 반환합니다 (http://www.docjar.com/docs/api/sun/s...tml#getEncoded)

JavaME에서 구현 한 내용은 다음과 같습니다. :

RSAPublicKeyStructure public_key_JAVAME=new RSAPublicKeyStructure(modulus,exponent); 
byte[] DER_encoded_public_key_JAVAME=public_key_JAVAME.getDEREncoded(); 

//the getEncoded functions returns exact the same byte array. 
나는이 때 즉, 서버 코드를 생성 DER 인코딩 된 키 JavaME를 검색 할 때 16,

그러나 :

EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(DER_encoded_public_key_JAVAME); 
KeyFactory keyFactory = KeyFactory.getInstance("RSA"); 
PublicKey puKey = keyFactory.generatePublic(publicKeySpec); 

을 나는

java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException: algid parse error, not a sequence 
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:188) 
at java.security.KeyFactory.generatePublic(KeyFactory.java:304) 

Caused by: java.security.InvalidKeyException: IOException: algid parse error, not a sequence 
at sun.security.x509.X509Key.decode(X509Key.java:380) 
at sun.security.x509.X509Key.decode(X509Key.java:386) 
at sun.security.rsa.RSAPublicKeyImpl.<init>(RSAPublicKeyImpl.java:66) 
at sun.security.rsa.RSAKeyFactory.generatePublic(RSAKeyFactory.java:281) 
at sun.security.rsa.RSAKeyFactory.engineGeneratePublic(RSAKeyFactory.java:184) 

재미있는 점을 얻을 : DER로 인코딩 된 (getencoded() 함수를 사용하여) 일반 자바의 키는 바이트 배열이 162 바이트이고 Bouncy Castle을 사용하여 JavaME로 인코딩 된 SAME 키 DER은 140 바이트입니다. 이 2 DER로 인코딩 된 키가 동일한 길이가 아니어야합니까? DER로 인코딩 된 형식의 동일한 키이므로 같은 이름이어야합니다.

내가 뭘 잘못하고 있니?


사실 나는 that.Problem 당신이 bouncyCastle에서의 PublicKey에서 SubjectPublicKeyInfo로 객체를 생성하는 방법을 알고있다 통지를하지 않았다? 나는 시도했다 :

ByteArrayInputStream bIn = new ByteArrayInputStream(RSApublickey.toString().getbytes()); SubjectPublicKeyInfo info = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(bIn).readObject());

그러나 그것은 작동하지 않았다.

ByteArrayInputStream(RSApublicKeyStructure.getEncoded()); SubjectPublicKeyInfo info = new SubjectPublicKeyInfo((ASN1Sequence)new ASN1InputStream(bIn).readObject());

실제로 내가 일을하지 않는 것이 기대 못했지만, 잘 나는 그것을 시도했다 : 나는 또한 시도했다. 그렇다면 RSAkeyparameters에서 Subjectpublickeyinfo를 어떻게 만들 수 있습니까? (이것은 Bouncy의 성 API의 모호함이 실제로 빛나는 지점 중 하나입니다)

큰 도움을 주신 귀하의 답변에 다시 한 번 감사드립니다. 나를 올바른 길로 가라.

답변

9

DER 인코딩은 인코딩 표준입니다. DER로 인코딩 된 키가 XML로 인코딩되었다고 말하는 것과 같습니다. 에 동의해야합니다. 디코딩 할 수 있도록 DER/XML로 인코딩 된 방법.

이 경우

에게 RSAPublicKeyStructure.getEncoded() 다시 표시 ASN.1 RSAPublicKey의 DER 인코딩과 같은 키 : 반면에

RSAPublicKey ::= SEQUENCE { 
    modulus INTEGER, -- n 
    publicExponent INTEGER -- e 
} 

X509EncodedKeySpec는 ASN의 DER 인코딩을 건네 될 것으로 기대하고있다.1 PublicKeyInfo :

PublicKeyInfo ::= SEQUENCE { 
    algorithm AlgorithmIdentifier, 
    PublicKey BIT STRING 
} 

을 만들려면 PublicKeyInfo BouncyCastle이 (GregS의 제공) 할 사용 :

RSAPublicKeyStructure rsaPublicKey = /* ... */ 
AlgorithmIdentifier rsaEncryption = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, null); 
SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo(rsaEncryption, rsaPublicKey); 
byte[] encodedPublicKeyInfo = publicKeyInfo.getEncoded(); 
+0

내가 코멘트로 응답하지 않음으로써 옳은 일을했지만 내 대답이 있었다면 나도 몰라를 코드 샘플로 인해 주석으로 읽는 것이 너무 어려움 – tdgs

+1

@ user581979 질문을 대신 업데이트 할 수 있습니다. 그 대답이 사람들을 혼란에 빠뜨리는 것으로 보았습니다. –

관련 문제