Elliptic-Curves

ECDSA 私鑰或公鑰是否包含有關簽名雜湊算法的數據?

  • September 23, 2022

:-) 你好

  1. 我想知道簽名雜湊算法是私鑰的一部分還是只是簽名過程的一部分?
  2. 簽名實例是否應該依賴於私鑰?(當然,還是說ECDSA)
  3. 如果我在呼叫簽名實例 SHA256withECDSA 之前不 sha256 我的數據。在呼叫簽名實例 NONEwithECDSA 之前,這是否與 sha256 我的數據具有相同的效果?
  4. 換句話說,這兩段 Java 程式碼是否等價:
PrivateKey privateKey = pk;
byte[] dataToSign = data;
Signature signature = Signature.getInstance("SHA256withECDSA");
signature.initSign(privateKey);
byte[] signedData = signature.update(dataToSign);
PrivateKey privateKey = pk;
byte[] dataToSign = SHA256(data);
Signature signature = Signature.getInstance("NONEwithECDSA");
signature.initSign(privateKey);
byte[] signedData = signature.update(dataToSign);

謝謝

編輯

從密鑰對中,我找不到有關雜湊算法的任何資訊。但是證書中有兩次提到它。

所以按照我的理解,這只是一個標誌,說“嘿,看看我的證書,我在簽名之前對我的數據進行了 SHA256 處理,所以如果你想檢查簽名,請確保對你的簽名進行 SHA256 處理”

我接近它是如何工作的嗎?(或者只是有點傻)

密鑰對詳細資訊

編輯:添加 ASN.1 數據

私鑰(未提及 EcdsaWithSHA256)

SEQUENCE
{
   INTEGER=0
   SEQUENCE
   {
       OBJECT IDENTIFIER=EcPublicKey (1.2.840.10045.2.1)
       OBJECT IDENTIFIER=Prime256v1 (1.2.840.10045.3.1.7)
   }
   OCTET STRING, encapsulates:
       SEQUENCE
       {
           INTEGER=1
           OCTET STRING=
               AD 73 F5 EA 9D 51 3E 91   ­sõê.Q>.
               09 54 9D B6 77 D9 AB 11   .T.¶wÙ«.
               88 EA 2B 86 D9 0F B9 65   .ê+.Ù.¹e
               9E CF E6 77 FF E7 8F 73   .Ïæwÿç.s
       }

}

公鑰(未提及 EcdsaWithSHA256)

SEQUENCE
{
   SEQUENCE
   {
       OBJECT IDENTIFIER=EcPublicKey (1.2.840.10045.2.1)
       OBJECT IDENTIFIER=Prime256v1 (1.2.840.10045.3.1.7)
   }
   BIT STRING=
       04 F1 73 E0 93 95 A7 FF   .ñsà..§ÿ
       D1 F9 CB 4A E7 A5 7C 97   ÑùËJç¥|.
       BC 85 FF 05 21 90 D0 9E   ¼.ÿ.!.Ð.
       BF FB DC F4 66 FD A2 D2   ¿ûÜôfý¢Ò
       2C 38 37 E6 9D 9C 5A 78   ,87æ..Zx
       10 AA 6D F1 36 43 DA 69   .ªmñ6CÚi
       15 ED 12 59 D8 21 78 20   .í.YØ!x 
       11 89 E7 B8 34 B5 28 FF   ..ç¸4µ(ÿ
       B9                        ¹
}

證書(提及 EcdsaWithSHA256)

SEQUENCE
{
   SEQUENCE
   {
       TAGGED [0]:
           INTEGER=2
       INTEGER=139084911 (0x84a446f)
       SEQUENCE
       {
           OBJECT IDENTIFIER=EcdsaWithSHA256 (1.2.840.10045.4.3.2)
           NULL
       }
       SEQUENCE
       {
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=CountryName (2.5.4.6)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=StateOrProvinceName (2.5.4.8)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=LocalityName (2.5.4.7)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=OrganizationName (2.5.4.10)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=OrganizationalUnitName (2.5.4.11)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=CommonName (2.5.4.3)
                   PRINTABLE STRING='Unknown'
               }
           }
       }
       SEQUENCE
       {
           UTC TIME=22/sept./2022 08:28:22 CEST (220922062822GMT+00:00)
           UTC TIME=21/déc./2022 07:28:22 CET (221221062822GMT+00:00)
       }
       SEQUENCE
       {
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=CountryName (2.5.4.6)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=StateOrProvinceName (2.5.4.8)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=LocalityName (2.5.4.7)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=OrganizationName (2.5.4.10)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=OrganizationalUnitName (2.5.4.11)
                   PRINTABLE STRING='Unknown'
               }
           }
           SET
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=CommonName (2.5.4.3)
                   PRINTABLE STRING='Unknown'
               }
           }
       }
       SEQUENCE
       {
           SEQUENCE
           {
               OBJECT IDENTIFIER=EcPublicKey (1.2.840.10045.2.1)
               OBJECT IDENTIFIER=Prime256v1 (1.2.840.10045.3.1.7)
           }
           BIT STRING=
               04 F1 73 E0 93 95 A7 FF   .ñsà..§ÿ
               D1 F9 CB 4A E7 A5 7C 97   ÑùËJç¥|.
               BC 85 FF 05 21 90 D0 9E   ¼.ÿ.!.Ð.
               BF FB DC F4 66 FD A2 D2   ¿ûÜôfý¢Ò
               2C 38 37 E6 9D 9C 5A 78   ,87æ..Zx
               10 AA 6D F1 36 43 DA 69   .ªmñ6CÚi
               15 ED 12 59 D8 21 78 20   .í.YØ!x 
               11 89 E7 B8 34 B5 28 FF   ..ç¸4µ(ÿ
               B9                        ¹
       }
       TAGGED [3]:
           SEQUENCE
           {
               SEQUENCE
               {
                   OBJECT IDENTIFIER=SubjectKeyIdentifier (2.5.29.14)
                   OCTET STRING, encapsulates:
                       OCTET STRING=
                           2C 8C 93 ED 48 FD 94 A4   ,..íHý.¤
                           08 CD 0F 33 8A A1 0C F5   .Í.3.¡.õ
                           F7 CD B3 CD               ÷ͳÍ

               }
           }
   }
   SEQUENCE
   {
       OBJECT IDENTIFIER=EcdsaWithSHA256 (1.2.840.10045.4.3.2)
       NULL
   }
   BIT STRING, encapsulates:
       SEQUENCE
       {
           INTEGER=
               0A 6D 35 87 32 88 62 12   .m5.2.b.
               FD 5F AE 23 AC 58 E7 9D   ý_®#¬Xç.
               DC 92 64 50 8C 6C 0B 1B   Ü.dP.l..
               FF 2A 35 02 11 10 8E 5D   ÿ*5....]
           INTEGER=
               32 9B 25 4D 2B DD 12 97   2.%M+Ý..
               01 1E F6 DA 02 86 4D ED   ..öÚ..Mí
               C2 B2 2F 79 5C 57 24 2F   ²/y\W$/
               4E F6 8E 72 88 B7 09 A6   Nö.r.·.¦
       }

}

我不確定 Java 程式碼,但密鑰對是否具有與之關聯的雜湊函式取決於它的AlgorithmIdentifier,它通常包含域參數的 ASN.1 OID 以及所述雜湊函式。

您會看到,RSA (PKCS #1) 和 ECC (SEC #1, #2) 的標準使用 ASN.1 語法定義密鑰的資料結構。

更新評論

我在私鑰中找不到散列算法,這是否意味著在簽名過程中散列不直接應用?

不可以。在簽名(和驗證)期間仍然需要散列函式,除了它可以是您的程序在計算簽名時選擇的任何散列函式。

這是SEC #1 ver.2附錄 C.5的摘錄,其中 ECDSA 的 OID 使用各種散列函式進行了實例化:

ecdsa-with-SHA1 OBJECT IDENTIFIER ::= { id-ecSigType sha1(1)} 
ecdsa-with-Recommended OBJECT IDENTIFIER ::= { id-ecSigType recommended(2) } 
ecdsa-with-Specified OBJECT IDENTIFIER ::= { id-ecSigType specified(3)} 
ecdsa-with-Sha224 OBJECT IDENTIFIER ::= { id-ecSigType specified(3) 1 } 
ecdsa-with-Sha256 OBJECT IDENTIFIER ::= { id-ecSigType specified(3) 2 } 
ecdsa-with-Sha384 OBJECT IDENTIFIER ::= { id-ecSigType specified(3) 3 } 
ecdsa-with-Sha512 OBJECT IDENTIFIER ::= { id-ecSigType specified(3) 4 } 
id-ecSigType OBJECT IDENTIFIER ::= { ansi-X9-62 signatures(4) }

引用自:https://crypto.stackexchange.com/questions/101976