Dsa
這是什麼類型的 ECDSA 簽名編碼?
我正在嘗試使用 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 的文件或測試案例。