我想知道C_DecryptFinal
& C_Decrypt
应该处理填充错误。
根据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
是否容易受到padding-oracle攻击?
答案 0 :(得分:2)
引用标准(第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并且根本不需要担心填充oracle攻击)
Desclaimer:我不是加密专家,所以请确认我的想法。