我想用Java生成RSA-SHA256签名,但无法在控制台上生成与OpenSSL相同的签名。这是我对OpenSSL所做的工作(在本教程之后):生成密钥对:openssl genrsa -out private.pem 1024提取公钥:openssl rsa -in private.pem -out public.pem -outform PEM -pubout创建数据哈希:echo 'data to sign' > data.txtopenssl dgst -sha256 < data.txt > hash生成的哈希文件从(stdin)=我手动删除的文件开始(首先忘了提起它,谢谢mata)。签名哈希:openssl rsautl -sign -inkey private.pem -keyform PEM -in hash > signature为了在Java中重现结果,我首先将私钥从PEM转换为DER:openssl pkcs8 -topk8 -inform PEM -outform DER -in private.pem -nocrypt > private.der现在,我编写了这个Java类来生成相同的签名:public class RSATest { public static void main(String[] args) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException { byte[] encodedPrivateKey = readFile("private.der"); byte[] content = readFile("data.txt"); KeyFactory keyFactory = KeyFactory.getInstance("RSA"); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(encodedPrivateKey); RSAPrivateKey privateKey = (RSAPrivateKey) keyFactory .generatePrivate(keySpec); Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(content); byte[] signatureBytes = signature.sign(); FileOutputStream fos = new FileOutputStream("signature-java"); fos.write(signatureBytes); fos.close(); } private static byte[] readFile(String filename) throws IOException { File file = new File(filename); BufferedInputStream bis = new BufferedInputStream(new FileInputStream( file)); byte[] bytes = new byte[(int) file.length()]; bis.read(bytes); bis.close(); return bytes; }}不幸的是结果并不相同,所以我想我一定做错了什么,但我不知道该怎么办。你们中的某人可以帮助我找到错误吗?
3 回答
梵蒂冈之花
TA贡献1900条经验 获得超5个赞
在第一种情况下,您采用任意摘要并对其进行签名,在此过程中将丢失使用sha256创建的摘要的信息,因此生成的签名将不/不能包含该信息,而第二种情况下的ASN1数据签名表明确实如此。因此,只有在验证者确切知道摘要是如何产生的情况下,才可以验证第一个签名,因此它不是真正无效,而是不完整(较低级别)的输出。
海绵宝宝撒
TA贡献1809条经验 获得超8个赞
你又是对的。使用您的命令,签名与Java生成的签名相同。但是另一个问题出现在我身上。我的旧(不正确)签名已使用命令成功验证,该命令openssl rsautl -verify -inkey public.pem -keyform PEM -pubin -in signature > verified
不再起作用。
添加回答
举报
0/150
提交
取消