Dsa

這是什麼類型的 ECDSA 簽名編碼?

  • May 5, 2020

我正在嘗試使用 ARM 的 CryptoCell 310(硬體加密模組)生成 ECDSA 簽名,並使用 mbedTLS 軟體庫驗證簽名。

硬體模組文件說 ECDSA 是根據 ANS X9.62 標準執行的。

為 SECP256R1 生成的密碼單元簽名為 64 字節長,如下所示:

95D9AFCC53A8618FF99AA7AB86013F59148B112BDFB15A7775BDE04B1001A84AB77A0F1C82327BA3B420AA172DB288CA030028CAF7C43637EF3B9990B21D082C

我需要將其轉換為 DER 編碼的簽名,以便 mbedTLS 可以對其進行驗證,但我不知道其中的 R 和 S 參數是如何編碼的。我試圖將該字元串的前半部分作為 R 參數,後半部分作為 S 並將其編碼為 DER,如下所示:

304602210095D9AFCC53A8618FF99AA7AB86013F59148B112BDFB15A7775BDE04B1001A84A022100B77A0F1C82327BA3B420AA172DB288CA030028CAF7C43637EF3B9990B21D082C

不幸的是,它沒有用。我也嘗試過大/小端交換,嘗試後半部分為 R,前半部分為 S,但它仍然沒有用。

我試圖獲得 X9.62 標準,但找不到任何關於編碼的資訊。

有誰知道那是什麼編碼?

提前致謝。

ANS X9.62–2005 在附錄 E.8 中聲明:

當數字簽名用 ASN.1 表示時,數字簽名應使用以下語法進行 ASN.1 編碼:

ECDSA-Sig-Value ::= SEQUENCE {
    r INTEGER,
    s INTEGER
}

我發現問題中的 DER 編碼沒有問題。

如果沒有庫,實現這一點是一件痛苦的事(來自痛苦的經歷:公共語言執行時曾經接受無效編碼,在高位位中有更多零位) $ r $ 和 $ s $ 比 ASN.1 所允許的,然後變得更嚴格,打破無效但工作程式碼呼叫它)。

更新:該標準還規定:

X.509 證書和 CRL 以及 CMS SignedData 將簽名表示為位字元串。如果證書、CRL 或 SignedData 使用 ECDSA 簽名,則 ASN.1 類型 ECDSA-Sig-Value 值的整個編碼應為位串的值。

但 AFAIK 這僅適用於證書。

現在這看起來像是一個純粹的程式問題,基本上是題外話。最好的選擇似乎是:探勘 mbedTLS 的文件或測試案例。

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