tdg*_*dgs 3 encryption bouncycastle java-me
我正在致力于将实例消息传递应用程序从Java移植到JavaME,它还实现了加密.问题是我想将我的公钥发送到服务器.桌面客户端具有此作业的代码:
byte[] encoded_public_key=publick_key.getEncoded();
Run Code Online (Sandbox Code Playgroud)
并且服务器具有此代码来检索密钥:
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(encoded_public_key);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey puKey = keyFactory.generatePublic(publicKeySpec);
Run Code Online (Sandbox Code Playgroud)
现在我看了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.
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用服务器代码检索JavaME创建的DER编码密钥时,换句话说,当我尝试这样做时:
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(DER_encoded_public_key_JAVAME);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey puKey = keyFactory.generatePublic(publicKeySpec);
Run Code Online (Sandbox Code Playgroud)
我明白了
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)
Run Code Online (Sandbox Code Playgroud)
有趣的是:来自普通Java的DER编码密钥(使用getencoded()函数)是一个162字节长的字节数组,而使用充气城堡在JavaME中编码的SAME密钥DER是140字节长.这些2 DER编码密钥不应该具有相同的长度吗?我的意思是它与DER编码格式中的密钥相同,因此它们应该是相同的.
我究竟做错了什么?
真的我没注意到.问题是你知道如何从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?(这是有弹性的城堡API默默无闻的点之一)
再次感谢您的回复,您已经给了我很大的帮助.您已经让我走上了正确的道路.
Ras*_*ber 10
DER编码只是编码的标准.说,一个关键是DER编码相当于说是XML编码:您需要在同意怎么就DER-/XML编码,以便能够解码.
在这种情况下,您RSAPublicKeyStructure.getEncoded()将密钥作为ASN.1的DER编码返回RSAPublicKey:
RSAPublicKey ::= SEQUENCE {
modulus INTEGER, -- n
publicExponent INTEGER -- e
}
Run Code Online (Sandbox Code Playgroud)
在X509EncodedKeySpec另一方面预计要切换DER编码的ASN.1的PublicKeyInfo:
PublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
PublicKey BIT STRING
}
Run Code Online (Sandbox Code Playgroud)
要创建一个PublicKeyInfo使用BouncyCastle这样做(由GregS提供):
RSAPublicKeyStructure rsaPublicKey = /* ... */
AlgorithmIdentifier rsaEncryption = new AlgorithmIdentifier(PKCSObjectIdentifiers.rsaEncryption, DERNull.INSTANCE);
SubjectPublicKeyInfo publicKeyInfo = new SubjectPublicKeyInfo(rsaEncryption, rsaPublicKey);
byte[] encodedPublicKeyInfo = publicKeyInfo.getEncoded();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3846 次 |
| 最近记录: |