Public-Key

EC 公鑰的密鑰長度錯誤

  • February 24, 2021

我在使用 pkcs11 庫從智能卡讀取 EC 公鑰時遇到問題。

使用 secp256r1 EC 算法,我總是得到 65 或 67 字節長度的公鑰和不同的智能卡。但是對於 ePass2003 令牌,公鑰的長度是 61 個字節。使用 pkcs11 庫,所有簽名和驗證方法都可以與這些對密鑰一起正常工作(因此密鑰對似乎沒問題),但是當我讀取公鑰時,我得到 61 個字節。

我嘗試使用 opensc 進行雙重測試。還有 EC_POINT 是 ePass2003 的 232 位,Safenet 5110 是 256 位。

您可以在下面看到 opensc 密鑰生成命令和結果:

"C:\Program Files\OpenSC Project\OpenSC\tools\pkcs11-tool.exe" --modul C:\Windows\System32\eps2003csp11.dll --login --login-type user --keypairgen --id 1 --key-type EC:secp256r1
Using slot 0 with a present token (0x1)
Logging in to "ePass2003".
WARNING: user PIN to be changed
Please enter User PIN: Key pair generated:
Private Key Object; EC
 label:
 ID:         01
 Usage:      sign, derive
 Access:     sensitive, always sensitive, never extractable, local
Public Key Object; EC  EC_POINT 232 bits
 EC_POINT:   a6ea6b9ce6bd0e086f029b082e1a4096062b79293b782bb0d255363994fd846e93ef0950a1338fa2106769a46f692da9a1607cd98a68b42b85a1ab47c9
 EC_PARAMS:  06082a8648ce3d030107
 label:
 ID:         01
 Usage:      encrypt, verify, wrap, derive
 Access:     local

下面是 Safenet 5110 令牌的相同程式碼:

"C:\Program Files\OpenSC Project\OpenSC\tools\pkcs11-tool.exe" --modul C:\Windows\System32\etpkcs11.dll --login --login-type user --keypairgen --id 1 --key-type EC:secp256r1
Using slot 2 with a present token (0x2)
Logging in to "GlobalSign SafeNet Token".
Please enter User PIN: Key pair generated:
Private Key Object; EC
 label:
 ID:         01
 Usage:      decrypt, sign, unwrap, derive
 Access:     sensitive, always sensitive, never extractable, local
Public Key Object; EC  EC_POINT 256 bits
 EC_POINT:   0441044de0b0df2e13f532240a9c3dd8123c86963ee7e456e62c4be767ff76a74ee935ba431a4d6159db031377d0a1e9cf2fc0b4e818912e9cfc124bc90c13f5b055c7
 EC_PARAMS:  06082a8648ce3d030107
 label:
 ID:         01
 Usage:      encrypt, verify, wrap, derive
 Access:     local

是的,這是 PKCS11 令牌庫中的一個錯誤。供應商解決了這個問題,在獲得一個新庫後,我可以從令牌中讀取 67 字節的 EC_POINT。因此,EC256 位公鑰不可能獲得 61 字節:)謝謝你們!

EC_POINT 必須是 ASN.1 編碼的八位字節字元串,並且 ePass2003 結果似乎不是有效的 ASN.1(比較Safenet 5110值和ePass2003值)

(由於一個有趣的巧合,八位字節字元串 ASN.1 前綴也是,因此在 Safenet 5110 輸出中04,標識它是未壓縮點的字節實際上是第三個字節中的第二個)04

我不知道它到底返回了什麼,但它肯定是錯誤的。簽名/驗證過程無關緊要,因為它們發生在令牌內部並且不依賴於令牌返回的 EC_POINT 值。

我的猜測是它在內部具有正確的值,但是返回 EC_POINT 值的 ePass2003 程式碼有一個錯誤。

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