问题描述
背景:两个系统(一个C++一个Java)实现双向签名与验签!描述:由C++程序调用OpenSSL生成公私钥串入库,然后使用私钥签名,发送给Java端,由Java去验签。我拿到公钥串和签名值后,使用如下方法,可以验签成功!RSAPublicKeyStructurersa=newRSAPublicKeyStructure((ASN1Sequence)ASN1Sequence.fromByteArray(pubKey));RSAPublicKeySpecress=newRSAPublicKeySpec(rsa.getModulus(),rsa.getPublicExponent());KeyFactorykeyFactory=KeyFactory.getInstance("RSA");PublicKeypublicKey=keyFactory.generatePublic(ress);但是,我拿到私钥(C++生成入库的串,此时主要是想试验一下)后加签,却一直抛异常:java.lang.ClassCastException:org.bouncycastle.asn1.DERApplicationSpecificcannotbecasttoorg.bouncycastle.asn1.ASN1Sequence抛异常部分代码如下:RSAPrivateKeyStructureasn1PrivKey=newRSAPrivateKeyStructure((ASN1Sequence)ASN1Sequence.fromByteArray(privateKey));RSAPrivateKeySpecrsaPrivKeySpec=newRSAPrivateKeySpec(asn1PrivKey.getModulus(),asn1PrivKey.getPrivateExponent());测试环境:jdk1.6、bcprov-jdk16-1.46.jar由于本人不太了解C++,所以对于C++调用OpenSSL后生成的密钥格式也不太清楚,忘各位大牛指点一二!十分感谢!
解决方案
解决方案二:
正巧也遇到该问题,不知您解决了没?
解决方案三:
网络传送由C++发送过来时需要asn1解码。本地不需要asn1解码。
解决方案四:
引用2楼t_jl1979的回复:
网络传送由C++发送过来时需要asn1解码。本地不需要asn1解码。
可以说说具体的实现方式吗
解决方案五:
asn1实现不同语言的通讯,本地不涉及自然不需要asn1.引用3楼baohuan_love的回复:
Quote: 引用2楼t_jl1979的回复:
网络传送由C++发送过来时需要asn1解码。本地不需要asn1解码。可以说说具体的实现方式吗
解决方案六:
privateKey应该为Base64解码之后的值。试试看呢
解决方案七:
私钥格式不对,看看生成的openssl参数,私钥是什么格式的,不行就用openssl转格式