我正在使用C_EncryptUpdate/C_EncryptFinal
而我真的不明白应该做什么C_EncryptFinal
。
我的假设是,当要加密的缓冲区大小不是块大小的倍数时,C_EncryptFinal
用于添加填充和最后一个块加密。
我说错了吗?在C_EncryptFinal
循环后始终会调用C_EncryptUpdate
吗?
答案 0 :(得分:1)
如果您想确保拥有应该呼叫C_EncryptFinal
的所有密文。
调用 C_EncryptInit 后,应用程序可以调用 C_Encrypt
加密单个部分的数据;或致电 C_EncryptUpdate 零或
更多次,然后是 C_EncryptFinal ,以加密多个数据 部分。加密操作一直有效,直到应用程序使用
为止 致电 C_Encrypt 或 C_EncryptFinal 以实际获得最终的结果 一块密文。处理其他数据(单个或
多个部分),应用程序必须再次调用 C_EncryptInit 。
如果您已准备好所有明文,则可以使用单个C_EncryptUpdate
替换对C_EncryptFinal
和C_Encrypt
(又名多部分操作)的来电缓冲区(又名单部分操作)。
(请注意某些机制可能只支持单部分操作,例如CKM_RSA_X_509
)
编辑:
C_EncryptFinal
不一定需要返回任何数据(即 pulEncryptedPartLen 中返回的加密数据部分长度可以为零)。
正如您所说,使用块对齐数据(通过CKM_AES_CBC
)提供的C_EncryptUpdate
加密将可能在C_EncryptFinal
之后没有返回加密数据部分大多数实现(因为它们会立即在C_EncryptUpdate
中返回相应的密文。)
但是可能存在一个实现,它在内部缓冲这个块对齐的数据而不加密它(因此返回C_EncryptUpdate
中的零长度输出数据部分),然后在{{1}期间立即加密所有缓冲的数据 - 示例可能是由智能卡(或远程主机)支持的实现,其中可能以更大的块发送数据是个好主意(即使cryptoki本身接收数据)在块大小的块中。)
PKCS#11 API允许您正确处理它(即检查返回的长度,移动目标指针/相应地更新可用空间)。
将其视为通用API ,需要支持任何可以想象的机制。