2

我想知道C_DecryptFinal&C_Decrypt应该如何处理填充错误。

根据pkcs11 2.20C_DecryptFinal可以返回CKR_ENCRYPTED_DATA_INVALIDor CKR_ENCRYPTED_DATA_LEN_RANGE,所以我假设如果 padding 无效,C_DecryptFinal/ C_Decryptreturn CKR_ENCRYPTED_DATA_INVALID

这是对的吗?

如果是这样,是否C_DecryptFinal/C_Decrypt容易受到 padding-oracle 攻击?

4

1 回答 1

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

因此,填充预言攻击可能是可能的。


由于PKCS#7填充是唯一为分组密码定义的填充方案,因此处理填充通常是应用程序的责任,这导致我认为应该是您问题的答案:

  • 无论此信息的来源如何(即 cryptoki或应用程序本身)。

  • 在cryptoki接口级别(即应用程序内部的攻击者)防止padding oracle攻击可能毫无意义,因为这样的攻击者可以直接使用适当的函数随意解密任何内容。


(当然最好使用某种形式的认证加密,完全不用担心padding oracle 攻击)

免责声明:我不是加密专家,所以请验证我的想法。

于 2015-11-04T22:54:42.123 回答