如何处理pkcs11中的填充错误?

时间:2015-11-04 10:56:24

标签: encryption cryptography pkcs#11 padding-oracle-attack

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

根据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攻击?

1 个答案:

答案 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:我不是加密专家,所以请确认我的想法。