我想知道C_DecryptFinal
&CCD_ 2应该处理填充错误。
根据pkcs11 2.20,C_DecryptFinal
可以返回CKR_ENCRYPTED_DATA_INVALID
或CKR_ENCRYPTED_DATA_LEN_RANGE
,所以我假设如果填充无效,C_DecryptFinal
/C_Decrypt
返回CKR_ENCRYPTED_DATA_INVALID
。
这是正确的吗?
如果是,C_DecryptFinal
/C_Decrypt
是否易受填充oracle攻击?
引用标准(第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
。
如果输入是块对齐的,则可能在CKM_*_PAD
机制的填充错误的情况下返回CKR_ENCRYPTED_DATA_INVALID
。
因此,填充预言机攻击是可能的。
由于PKCS#7填充是块密码唯一定义的填充方案,因此通常由应用程序负责处理填充,这导致了我认为应该是您问题的答案:
-
应用程序(即"cryptocki客户端")不应向外部攻击者(即"应用程序客户端")提供任何预言机来确定填充错误,无论这些信息的来源(即cryptochi或应用程序本身)如何。
-
在cryptocki接口级别(即应用程序内部的攻击者)防范填充预言机攻击可能没有意义,因为这样的攻击者可以直接使用适当的函数随意解密任何内容。
(当然,最好使用某种形式的身份验证加密,根本不需要担心填充预言机攻击)
Desclaimer:我不是加密货币专家,所以请验证我的想法。