【问题标题】:What's the detail in "SHA1withRSA"?“SHA1withRSA”中的细节是什么?
【发布时间】:2017-07-30 04:25:53
【问题描述】:

无辜地,我以为“SHA1withRSA算法”只是简单地用“SHA1”操作plainText,并使用RSA/pkcs1padding来加密“SHA1”的结果。但是直到我写了一些java代码来测试我才发现我错了我的想法。 我使用 RSA publickey 来解密我使用相应的 privatekey 用 "SHA1withRSA algorithm" 签名的签名。但是我发现结果不等于“SHA1(plainText)”,下面是我的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

很容易找到rsaDecodeHex!=sha1Hex,在哪里

rsaDecodeHex=3021300906052b0e03021a050004147c4a8d09ca3762af61e59520943dc26494f8941b

sha1Hex=7c4a8d09ca3762af61e59520943dc26494f8941b 。

那么,“SHA1withRSA”中的细节是什么?

【问题讨论】:

  • 仅作记录:您明白使用 SHA1 意味着“浪费时间和精力”吗? blog.qualys.com/ssllabs/2014/09/09/… ...当您开始研究密码学时,最好选择推荐在 2017 年使用的算法。SHA1 是...不是。
  • 仅作记录:如果您在这里没有得到好的答案;考虑询问security.stackexchange.com
  • 好吧,乍一看rsaDecodeHex 似乎是sha1Hex 填充了几个前缀字节,但我可能错了。
  • @GhostCat 这显然取决于您使用它的目的,但在此方案中,SHA1 仅用作传统的散列函数,而 RSA 提供保密性。如果你也需要你的哈希是安全的(你可能会这样做),那么 SHA1 绝对不是答案。
  • @biziclop:这是一个签名,RSA 本身不提供保密性。所以SHA1也需要在这种情况下提供一些安全保障。

标签: java encryption rsa digital-signature sha1


【解决方案1】:

PCKS#1 v15 中定义的数字签名算法对摘要算法标识符和以 ASN.1 编码的消息的摘要进行 RSA 加密

signature = 
    RSA_Encryption( 
      ASN.1(DigestAlgorithmIdentifier  + SHA1(message) )) 

见 (RFC2313)

10.1 签名过程

签名过程包括四个步骤:消息摘要、数据 编码、RSA 加密和八位字节串到位串的转换。 签名过程的输入应该是一个八位字节串 M, 信息;和签名者的私钥。签名的输出 process 应该是一个比特串 S,即签名。

所以您的rsaDecodeHex 包含plainText 的算法标识符和SHA1 摘要

【讨论】:

  • 你能帮我找出 SHA1withRSA 的 OID 是什么吗?当我使用 Java API 签名时,与 SHA1withRSA 的结果相比,“1.2.840.113549.1.1.5”和“1.3.14.3.2.29”都不能产生相同的结果
  • 看看这个ASN.1解码器lapo.it/asn1js/…你的签名正在使用1.3.14.3.2.29
  • 但是为什么 301f300706052b0e03021a04147c4a8d09ca3762af61e59520943dc26494f8941b 得到了与您提供的 ASN.1 解码器相同的结果?
  • 我发现1.3.14.3.2.26是java中SHA1withRSA使用的OID。并且 ASN1SEQUENCE 包含一个不同于“301f300706052b0e03021a04147c4a8d09ca3762af61e59520943dc26494‌”的空元素
  • 我在评论中写了1.3.14.3.2.29。这是一个错字。应该是1.3.14.3.2.26
猜你喜欢
  • 2022-01-10
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 2020-06-06
  • 2017-07-04
相关资源
最近更新 更多