gpt4 book ai didi

encryption - 传输 RSA 公钥时出现问题,java,充气城堡

转载 作者:行者123 更新时间:2023-12-02 17:28:25 44 4
gpt4 key购买 nike

我正在致力于将实例消息应用程序从 Java 移植到 JavaME,该应用程序也实现了加密。问题是我想将我的公钥发送到服务器。桌面客户端有此作业的代码:

byte[] encoded_public_key=publick_key.getEncoded();

服务器有以下代码来检索 key :

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

现在我查看了 getEncoded 的 API,它说它以字节数组的形式返回 key 的 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.

但是,当我尝试使用服务器代码检索 JavaME 创建的 DER 编码 key 时,换句话说,当我尝试这样做时:

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)

有趣的一点:普通 Java 中的 DER 编码 key (使用 getencoded() 函数)是一个字节数组,长度为 162 字节,而使用 bouncy caSTLe 在 JavaME 中编码的 SAME key DER 长度为 140 字节。这 2 个 DER 编码 key 不应该具有相同的长度吗?我的意思是它在 DER 编码格式中是相同的 key ,所以它们应该是相同的。

我做错了什么?

<小时/>

确实,我没有注意到这一点。问题是您知道如何从 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 的默默无闻真正发光的点之一)

再次感谢您的回复,您给了我很大的帮助。您让我走上了正确的道路。

最佳答案

DER 编码只是一种编码标准。说 key 是 DER 编码的就相当于说它是 XML 编码的:您需要就其 DER-/XML 编码方式达成一致才能对其进行解码。

在这种情况下,您的 RSAPublicKeyStructure.getEncoded() 返回 key 作为 ASN.1 RSAPublicKey 的 DER 编码:

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

另一方面,X509EncodedKeySpec 期望获得 ASN.1 PublicKeyInfo 的 DER 编码:

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

要使用 BouncyCaSTLe 创建 PublicKeyInfo,请执行以下操作(由 GregS 提供):

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

关于encryption - 传输 RSA 公钥时出现问题,java,充气城堡,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4739662/

44 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com