只是我的项目的一些背景:
我正在使用ECDH for Android(BouncyCastle)实施SMS加密程序,并且需要通过SMS发送我的公钥.从功能上讲,所有功能都可以正常运行,但是我对已实现的X.509代码有些怀疑.
在发送方:
byte[] pubEnc = aKeyPair.getPublic().getEncoded();
X509EncodedKeySpec pubX509 = new X509EncodedKeySpec(pubEnc);
然后将pubX509编码为Base64并通过SMS发送
在接收方:
KeyFactory keyFac = KeyFactory.getInstance("ECDH", "SC");
X509EncodedKeySpec pubX509 = new X509EncodedKeySpec(SharedS);
ECPublicKey pubKey = (ECPublicKey)keyFac.generatePublic(pubX509);
接收到的值被Base64解码为SharedS,然后将其转换为新的pubX509
正如我已经提到的,在实现方面,此代码似乎运行良好,但是我想了解我是否正确地实现了X509.
任何建议将不胜感激.
解决方法:
Sun(现在为Oracle)将其称为X509EncodedKeySpec的事实仅仅是因为公共密钥是使用更大的X.509证书标准中指定的格式编码的.对于Internet,在RFC 5280中指定了X.509证书的正确实现.如您所见,该RFC的长度超过140页.在整个文档中,以下3行描述了如何表示公钥:
SubjectPublicKeyInfo ::= SEQUENCE {
algorithm AlgorithmIdentifier,
subjectPublicKey BIT STRING }
这是Java类X509EncodedKeySpec产生的格式.您可以忽略所有X509标准,而不必使用证书.