Public-Key
EC 公鑰的密鑰長度錯誤
我在使用 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 程式碼有一個錯誤。