Signature

ECDSA 簽名的 BER 或 DER X9.62

  • June 13, 2018

ECDSA 簽名的簽名格式可以根據 X9.62 使用 ASN.1 整數進行編碼,也可以由兩個大小與密鑰大小相同的整數組成。

如果使用 X9.62 格式,是否必須使用結果的 DER 編碼(可區分編碼規則),還是 BER 編碼(基本編碼規則)也可以接受?

X9.62-2005 的附件 E 說:

附件 E 根據抽象語法符號一 (ASN.1) 提供了橢圓曲線密碼學的語法,包括域參數、密鑰和簽名。雖然橢圓曲線域參數、密鑰和簽名不要求用 ASN.1 語法表示,但如果用 ASN.1 語法表示,則它們的語法應與此處定義相同。儘管這些 ASN.1 定義很可能會使用可分辨編碼規則 (DER) 進行編碼,但也可以使用其他編碼規則。

RFC 3279,第 2.2.3 節要求使用 ASN.1 來表示簽名,但令人驚訝的是,它沒有提及編碼規則(而它明確要求 DER 用於公鑰)。

一些密碼庫堅持嚴格的 DER。Wycheproof 項目包含一些測試向量來檢查(給出的原因是:“限制簽名延展性”)。OpenSSL就是這樣一個庫:在解碼傳入的簽名後,它使用嚴格的 DER 規則對其進行重新編碼,並檢查它是否獲得了完全相同的字節序列。顯然,這是由於稱為CVE-2014-8275的“漏洞”造成的,其中一些系統通過指紋對證書實施黑名單,即整個證書的雜湊(而不僅僅是內部要簽名的)。在我看來,黑名單系統不能提供良好的安全性,為此使用指紋非常愚蠢,但顯然 OpenSSL 開發人員認為他們需要對 (EC)DSA 簽名和證書本身。

其他庫接受變體。例如,BearSSL要求長度是明確的,但不一定是最小的(即,兩個值 0x00 的一些額外前導字節被接受INTEGER值,接受一些額外的值 0x00 的前導字節)。

從這些數據點來看,根據相關標準,簽名的非嚴格 DER 編碼似乎在名義上是可以接受的,但它們不會在任何地方都被接受。因此,在實踐中,任何 ECDSA 庫都應確保其生成的簽名遵循嚴格的 DER 規則。

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