我一直在尝试使用智能卡解密文件,但收到奇怪的消息。
我正在使用PKCS11Interop来调用使用pkcs11.h的dll文件中的C_Decrypt 与智能卡进行通信。
这是代码:
public byte[] Decrypt(byte[] encData)
{
byte[] decrypt = null;
using (Session session = _slot.OpenSession(SessionType.ReadOnly))
using (Mechanism mechanism = new Mechanism(CKM.CKM_RSA_PKCS))
{
decrypt = session.Decrypt(mechanism, _privateKeyHandle, encData);
}
return decrypt;
}
奇怪的是,当我将Yubico smart card与opensc-pkcs11.dll一起使用时,它工作正常。当我将HSID5000与hsid-pkcs11.dll一起使用时,它将失败,并显示消息“ C_Decrypt返回了CKR_OPERATION_NOT_INITIALIZED”
当我使用相同的智能卡(HSID5000)但在pkcs11-tool中而不是Pkcs11Interop时,它起作用:
pkcs11-tool --id 01 --decrypt -p ******** -m RSA-PKCS --module hsid-pkcs11.dll --input-file input.enc
这是在两种情况下(Opensc智能卡和HSID智能卡)由Pkcs11Interop生成的pkcs11-logger文件
Yubico opensc智能卡日志文件:
0x00000b04 : 0x00000734 : Calling C_Decrypt
0x00000b04 : 0x00000734 : Input
0x00000b04 : 0x00000734 : hSession: 35424832
0x00000b04 : 0x00000734 : pEncryptedData: 0000000002E334C0
0x00000b04 : 0x00000734 : *pEncryptedData: HEX(793...D99)
0x00000b04 : 0x00000734 : ulEncryptedDataLen: 256
0x00000b04 : 0x00000734 : pData: 0000000002E346E0
0x00000b04 : 0x00000734 : pulDataLen: 000000000042EB48
0x00000b04 : 0x00000734 : *pulDataLen: 7
0x00000b04 : 0x00000734 : Output
0x00000b04 : 0x00000734 : pData: 0000000002E346E0
0x00000b04 : 0x00000734 : pulDataLen: 000000000042EB48
0x00000b04 : 0x00000734 : *pData: HEX(730D0A730D0A73)
0x00000b04 : 0x00000734 : *pulDataLen: 7
0x00000b04 : 0x00000734 : Returning 0 (CKR_OK)
HSID智能卡日志文件:
0x00001b90 : 0x00000d94 : Calling C_Decrypt
0x00001b90 : 0x00000d94 : Input
0x00001b90 : 0x00000d94 : hSession: 12274064
0x00001b90 : 0x00000d94 : pEncryptedData: 0000000002E6A300
0x00001b90 : 0x00000d94 : *pEncryptedData: HEX(49B....527)
0x00001b90 : 0x00000d94 : ulEncryptedDataLen: 256
0x00001b90 : 0x00000d94 : pData: 0000000002E6B520
0x00001b90 : 0x00000d94 : pulDataLen: 00000000004AE938
0x00001b90 : 0x00000d94 : *pulDataLen: 256
0x00001b90 : 0x00000d94 : Returning 145 (CKR_OPERATION_NOT_INITIALIZED)
有人可以帮我吗?
hsid-pkcs11.dll的完整日志文件为here
经过jariq的非凡评论后,HSID令牌不喜欢多次调用C_Decrypt,因此我使用了他的包装器,但没有使用HighLevel库,而是使用了Lowlevel库,只调用了一次C_Decrypt。而且有效!
谢谢大家。
答案 0 :(得分:2)
当使用PKCS#11函数中的--decrypt
个自变量pkcs11-tool
调用(请参见source code)执行时:
C_DecryptInit
初始化操作C_Decrypt
,带有分配的输出缓冲区,以接收解密的数据session.Decrypt()
的PKCS#11函数之后,Pkcs11Interop调用(请参见source code):
C_DecryptInit
初始化操作C_Decrypt
,但未分配输出缓冲区来确定解密数据的长度C_Decrypt
,带有分配的输出缓冲区,以接收解密的数据当应用程序两次调用hsid-pkcs11.dll
时,C_Decrypt
不喜欢它,就像Pkcs11Interop一样。但是,两次调用C_Decrypt
完全没问题,PKCS#11 v2.20 specification的第11.2章介绍了此技术。
第145页上的说明完全相同:
C_Decrypt
使用第11.2节中描述的关于产生输出的约定。
IMO,您需要联系非托管PKCS#11库的供应商,并要求他提供修复或至少说明。