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());
큰 도움을 주신 귀하의 답변에 다시 한 번 감사드립니다. 나를 올바른 길로 가라.
내가 코멘트로 응답하지 않음으로써 옳은 일을했지만 내 대답이 있었다면 나도 몰라를 코드 샘플로 인해 주석으로 읽는 것이 너무 어려움 – tdgs
@ user581979 질문을 대신 업데이트 할 수 있습니다. 그 대답이 사람들을 혼란에 빠뜨리는 것으로 보았습니다. –