1. ホーム
  2. java

[解決済み] SHA1withRSA "の詳細は?

2022-02-15 05:10:28

質問内容

当初、quot;SHA1withRSA algorithm"は、単にプレーンテキストをquot;SHA1"で演算し、RSA/pkcs1paddingでquot;SHA1"の結果を暗号化したものだと思っていましたが、javaコードを書いて試してみると違っていることがわかりました。 私はRSA公開鍵を使って署名を復号し、対応する秘密鍵を使って"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 。

で、quot;SHA1withRSA"の詳細は?

どのように解決するのか?

PCKS#1 v15で定義されている電子署名アルゴリズムは、ダイジェストアルゴリズムの識別子とASN.1でエンコードされたメッセージのダイジェストに対してRSA暗号化を行います。

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

参照( RFC2313 )

10.1 署名プロセス

署名のプロセスは、メッセージのダイジェスト化、データ エンコーディング、RSA 暗号化、およびオクテット文字列からビット文字列への変換を行う。 署名プロセスへの入力は、オクテット文字列Mである。 メッセージ、および署名者の秘密鍵が必要である。署名の出力 は、署名であるビット列Sとする。

では、あなたの rsaDecodeHex のアルゴリズム識別子とSHA1ダイジェストが含まれています。 plainText