2011-01-19 3 views
3

私はJavaからJavaMEへのインスタンスメッセージングアプリケーションの移植に取り組んでおり、暗号化も実装しています。問題は、公開鍵をサーバーに送信することです。デスクトップクライアントは、この仕事のために、このコードがあります。RSA公開鍵javaME、弾き語りの城

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エンコード:

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) 

興味深いポイントを得る:

は、しかし、私はJavaMEのを取得しようとすると、私はこれをしようとすると、他の言葉では、サーバーコードでDERエンコードされたキーを作成しました(getencoded()関数を使用して)通常のJavaからのキーは、バイト配列は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のCastle APIのあいまいさが本当に輝いている点の1つです)

大変助けていただきありがとうございます。私を正しい軌道に乗せてください。

答えて

9

DERエンコーディングはエンコーディングの単なる標準です。キーがDERでエンコードされていると言うことは、エンコードされていることを意味します。に同意する必要があります。デコードするには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 
} 

はBouncyCastleは、この(GregSの礼儀)を行う使用してPublicKeyInfoを作成するには:

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

私がコメントに応答しないことにより、正しいことをしましたが、私の答えだった場合、私は知りませんコードサンプルのためコメントとして読みにくいです – tdgs

+1

@ user581979代わりに質問を更新することができます。答えとして、人々を混乱させる可能性が高いことが分かります。 –