Java 什么';细节在哪里;SHA1withRSA;?

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

我天真地以为“SHA1withRSA algorithm”只是简单地用“SHA1”操作明文,并使用RSA/pkcs1padding对“SHA1”的结果进行加密。然而,我发现我错了,直到我编写了一些java代码来测试我的想法。 我使用RSA公钥对签名进行解密,我使用相应的私钥使用“SHA1withRSA算法”进行签名。但我发现结果不等于“SHA1(纯文本)”,下面是我的java代码:

    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