Java 什么';细节在哪里;SHA1withRSA;?
我天真地以为“SHA1withRSA algorithm”只是简单地用“SHA1”操作明文,并使用RSA/pkcs1padding对“SHA1”的结果进行加密。然而,我发现我错了,直到我编写了一些java代码来测试我的想法。 我使用RSA公钥对签名进行解密,我使用相应的私钥使用“SHA1withRSA算法”进行签名。但我发现结果不等于“SHA1(纯文本)”,下面是我的java代码:Java 什么';细节在哪里;SHA1withRSA;?,java,encryption,rsa,digital-signature,sha1,Java,Encryption,Rsa,Digital Signature,Sha1,我天真地以为“SHA1withRSA algorithm”只是简单地用“SHA1”操作明文,并使用RSA/pkcs1padding对“SHA1”的结果进行加密。然而,我发现我错了,直到我编写了一些java代码来测试我的想法。 我使用RSA公钥对签名进行解密,我使用相应的私钥使用“SHA1withRSA算法”进行签名。但我发现结果不等于“SHA1(纯文本)”,下面是我的java代码: String plaintext= "123456"; Signature signature=S
String plaintext= "123456";
Signature signature=Signature.getInstance("SHA1withRSA",new BouncyCastleProvider());
signature.initSign(pemPrivatekey);
signature.update(plaintext.getBytes());
byte[] sign = signature.sign();
//RSA decode
byte[] bytes = RsaCipher.decryptByRsa(sign, pemPublickey);
String rsaDecodeHex=Hex.toHexString(bytes);
System.out.println(rsaDecodeHex.toLowerCase());
String sha1Hex = Hash.getSha1(plaintext.getBytes());
System.out.println(sha1Hex);
//rsaDecodeHex!=sha1Hex
很容易找到rsadecodechex=SHA1十六进制
,其中
RSADecodexex=302130090652B0E03021A050004147C4A8D09CA3762AF61E59520943DC26494F8941B
及
sha1Hex=7c4a8d09ca3762af61e59520943dc26494f8941b
那么,“SHA1withRSA”中的细节是什么 PCKS#1 v15中定义的数字签名算法对摘要算法标识符和ASN中编码的消息摘要进行RSA加密。1
signature =
RSA_Encryption(
ASN.1(DigestAlgorithmIdentifier + SHA1(message) ))
见()
10.1签名流程
签名过程包括四个步骤:消息摘要、数据
编码、RSA加密和八位字符串到位字符串的转换。
签名过程的输入应为八位字节字符串M
消息和签名者的私钥。签名的输出
进程应为位字符串S,即签名
因此,您的
rsaDecodeHex
包含算法标识符和明文的SHA1摘要
只是为了记录:您知道使用SHA1意味着“浪费时间和精力”。。。当你开始研究密码学时,最好选择2017年推荐使用的算法。SHA1是。。。不是。只是记录在案:如果你在这里没有得到好的答案;考虑一下,很快地看一下,代码> RSADECODEHEX 似乎是“代码> Sh1HEX < /Cube >加上一对前缀字节,但我可能错了。@ GooCAT显然取决于您使用的是什么,但是在这个方案中,Sh1只是一个传统的散列函数,而RSA提供了保密性。如果你也需要你的散列数据是安全的(你可能需要),那么SHA1肯定不是答案。@biziclop:这是一个签名,RSA本身不提供保密性。因此,在这种情况下,SHA1也需要提供一些安全保证。您能帮我找到什么是SHA1与RSA的OID吗?“1.2.840.113549.1.1.5”和“1.3.14.3.2.29”当我使用Java API签名时,无法产生与SHA1 WithRSA相同的结果看看这个ASN.1解码器您的签名使用的是1.3.14.3.2.29
但是为什么301f300706052b0e03021a04147c4a8d09ca3762af61e59520943dc26494f8941b通过您提供的ASN.1解码器得到了相同的结果?我发现1.3.14.3.2.26是OID在java中由SHA1withRSA使用。ASN1序列包含一个空元素,它与“301f300706052b0e03021a04147c4a8d09ca3762af61e59520943dc26494”不同"我在评论中写了1.3.14.3.2.29
。这是一个打字错误。应该是1.3.14.3.2.26