2015-11-04 32 views
1

我想知道如何C_DecryptFinal & C_Decrypt應該處理填充錯誤。如何處理pkcs11中的填充錯誤?

pkcs11 2.20C_DecryptFinal可以返回CKR_ENCRYPTED_DATA_INVALIDCKR_ENCRYPTED_DATA_LEN_RANGE, 所以我想,如果填充是無效的,C_DecryptFinal/C_Decrypt回報CKR_ENCRYPTED_DATA_INVALID

它是正確的嗎?

如果是這樣,是C_DecryptFinal/C_Decrypt易受padding-oracle攻擊?

+0

我記得某些模糊的東西在一些特定的硬件設備上(或者他們的PKCS11驅動程序)的pading-oracle攻擊。你需要問一下谷歌,但我相信你*會*找到與你的問題有關的東西。 –

回答

1

援引的標準(11.1.6節):

  • CKR_ENCRYPTED_DATA_LEN_RANGE:密文輸入到解密 操作已被確定爲無效的密文僅基於 基礎其長度的。根據操作的機制,這可能意味着密文太短,太長,或者不是某些特定塊大小的倍數。該返回值比CKR_ENCRYPTED_DATA_INVALID的優先級高 。

  • CKR_ENCRYPTED_DATA_INVALID:加密的解密輸入 操作已被確定爲無效密文。返回 值的優先級低於CKR_ENCRYPTED_DATA_LEN_RANGE。

所以塊密碼的CKR_ENCRYPTED_DATA_LEN_RANGE應該當輸入不是塊對齊返回。

如果輸入是塊對齊的,則CKR_ENCRYPTED_DATA_INVALID可能在CKM_*_PAD機制的填充錯誤的情況下返回。

因此填充oracle攻擊可能是可能的。


由於PKCS#7填充是塊密碼的唯一定義的填充方案,這是很經常的應用程序的責任來處理填充,從而導致什麼,我認爲應該是答案你的問題:

  • 它是由應用程序(即「中的Cryptoki客戶端」)不提供外部攻擊者(即「應用程序客戶端」)與任何Oracle確定填充是錯誤的,不管這個信息的來源(即cryptoki或應用程序本身)。

  • 防止cryptoki接口級別(即應用程序內部的攻擊者)的填充oracle攻擊可能沒有意義,因爲這樣的攻擊者可以直接使用適當的函數任意解密任何東西。


(當然最好是使用某種形式的authenticated encryption而不必擔心填充神諭攻擊的話)

Desclaimer:我沒有加密專家,所以請確認我的想法。

+0

Thx爲您的答案,確實CKR_DATA_INVALID似乎是檢測到無效填充時返回的最合適的錯誤。 – klook

+0

@klook寫一個POC代碼來執行對某些pkcs11實現的填充oracle攻擊(或採用現有的pkcs11實現)可能會很有趣,但正如我試圖在答案中所表達的那樣 - 此填充oracle應該僅可用到應用程序(即已經被授權直接解密的「cryptoki客戶端」),所以使用這種類型的攻擊(應用程序)沒有任何好處。應用程序的責任是不允許外部攻擊者(即「應用程序客戶端」)訪問填充oracle。這回答了你的問題了嗎? – vlp

+0

根據https://eprint.iacr.org/2012/417.pdf,避免填充oracle問題的最佳解決方案是使用經過身份驗證的密碼模式,如GCM,所以我認爲CKR_DATA_INVALID可以不經過第二次思考就使用。 – klook