SignRecover 和 VerifyRecover 如何工作?
在 PKCS#11 中,有 SignRecover 和 VerifyRecover 方法,
可以從簽名中恢復數據。這些方法是如何工作的?
我可以使用 openssl 實現 signrecover 和 verifyrecover 嗎?
TL;DR:他們可能不會。
PKCS#11 是加密令牌(例如 HSM 或智能卡)的軟體介面標準,旨在實現不同令牌供應商的實現之間的兼容性。它還允許相同的 API 使用各種加密機制來執行類似的任務,只需更改幾個值,主要是 Mechanisms 參數(具有標準分配值的整數)和一些大小。
PKCS#11 是在 RSA Security 的監督下編寫的,該時期的檔案連結自EMC 的 PKCS#11 頁面。PKCS#11 移至OASIS,這將它們變成(特別是)基本標準 v2.40c01 (2014-12-23)和Current Mechanisms v2.40c01 (2014-12-23);這些計劃於 2015 年 4 月 15 日獲得批准,稍作改動。
PKCS#11 有一個用於帶有(總)消息恢復的簽名方案的 API;也就是說,一種簽名方案,其中被簽名的(整個)消息在簽名的密碼中傳達,並且是簽名驗證的輸出,而不是輸入(如在帶有附錄的簽名方案中的情況,例如PKCS#1的 RSASSA-PKCS1-V1_5 或 RSASSA-PSS )。
對於簽名生成,C_SignRecoverInit 和 C_SignRecover 對於帶有(總)消息恢復的簽名方案,就像 C_SignInit 和 C_Sign 對於帶有附錄的簽名方案一樣,具有完全相同的介面。對於簽名驗證,C_VerifyRecoverInit 和 C_VerifyRecover 對於帶有消息恢復的簽名方案就像 C_VerifyInit 和 C_Verify 對於帶有附錄的簽名方案,不同之處在於 C_VerifyRecover 的介面:它產生作為輸出的恢復消息(名義上與輸入傳遞的消息相同)到 C_SignRecover),當 C_Verify接收到要驗證的消息作為輸入時(名義上與在輸入上傳遞給 C_Sign 的消息相同)。
參考:C_VerifyRecover 的定義和我的記憶。
CKM_RSA_X_509 是 C_SignRecoverInit、C_SignRecover、C_VerifyRecoverInit、C_VerifyRecover 支持的最簡單的機制。基本上這是教科書 RSA。
對於 CKM_RSA_X_509 機制,忽略與會話狀態有關的檢查:
C_SignRecover 與 C_Sign 一樣執行;那是:
- 檢查要簽名的消息的大小最多為 $ k $ 字節在哪裡 $ 256^{k-1}\le N<256^k $ 和 $ N $ 是 RSA 公共模數
- 將其轉換為整數 $ m $ 通過大端約定
- 支票 $ m<N $
- 生產 $ s=m^d\pmod N $ 在哪裡 $ d $ 是 RSA 私有指數
- 轉換 $ s $ 到 $ k $ 按大端約定的字節,並輸出它。
C_VerifyRecover
- 檢查簽名的大小是否準確 $ k $ 字節
- 將其轉換為整數 $ s $ 通過大端約定
- 支票 $ s<N $
- 生產 $ m=s^e\pmod N $ 在哪裡 $ e $ 是 RSA 公共指數
- 轉換 $ m $ 到 $ k $ 按大端約定的字節,並輸出它。
參考: CKM_RSA_X_509機制的定義;它的輸入和輸出大小表(其中£被讀作≤);和我的記憶。
注意事項:
CKM_RSA_X_509 機制只能用作建構塊,因為教科書 RSA 是不安全的。
CKM_RSA_9796 機制在 PKCS#11 中用作具有消息恢復的簽名方案範例,不應使用,並且在選擇消息攻擊下不安全,即使這是其設計目標之一。它是ISO/IEC 9796:1991的(一個輕微變體)(可能在這裡有售),但被撤回並且幾乎被遺忘(計劃重新命名為 ISO/IEC 9796-1,但在儀式正式批准之前遭受了致命的傷害:可以通過 3 條選定消息的簽名進行偽造)。
CKM_RSA_PKCS 機制(可能支持帶有消息恢復的簽名)不應用於在對手的直接控制下對消息進行簽名,因為它在選擇消息攻擊下不安全(它不是故意的;散列消息的變體根據 RSASSA-PKCS1-V1_5 的要求,例如 CKM_SHA256_RSA_PKCS 更強,但除了與現有系統兼容外,仍然不推薦使用)。
PKCS#11 沒有用於部分消息恢復的簽名方案的 API,並且不支持 ISO/IEC 9796-2(任何方案),這通常是使用消息恢復的方式(例如,用於 EMV 銀行的智能卡、歐洲數字行駛記錄儀證書);因此,具有 PKCS#11 的 ISO/IEC 9796-2 通常在具有 CKM_RSA_X_509 的 PKCS#11 之上實現,或者作為專有擴展,或者可能作為(可能是標準)機制的內部組件,例如 CKM_CMS_SIG,而不是通過PKCS #11。
Profiles v2.40c01 (2014-12-23)列出了符合要求的 PKCS#11 的特性,但它對消息恢復保持沉默;就它在該領域發現的代幣中的支持程度得出你自己的結論。我見過一個實現,它的文件在最重要的機制與功能支持矩陣中省略了 SR/VR 列(但盡職盡責地提到 C_SignRecoverInit、C_SignRecover、C_VerifyRecoverInit、C_VerifyRecover 沒有限制)。