Elliptic-Curves
ECDSA 私鑰或公鑰是否包含有關簽名雜湊算法的數據?
:-) 你好
- 我想知道簽名雜湊算法是私鑰的一部分還是只是簽名過程的一部分?
- 簽名實例是否應該依賴於私鑰?(當然,還是說ECDSA)
- 如果我在呼叫簽名實例 SHA256withECDSA 之前不 sha256 我的數據。在呼叫簽名實例 NONEwithECDSA 之前,這是否與 sha256 我的數據具有相同的效果?
- 換句話說,這兩段 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) }