PKCS#11 C_Encrypt因128位AES密钥

时间:2018-05-15 09:08:25

标签: pkcs#11

我使用“C_CreateObject”生成128位AES对象。 然后我执行以下操作来加密一段数据,并在调用“C_Encrypt”时获得“Bad Argumnents”错误以获取加密数据长度。

char clear[] = "My name is Eric!";
buf_len = sizeof(clear) -1;

rv = pfunc11->C_EncryptInit(session, pMechanism, hObject);

if (rv != CKR_OK)    
{
    printf("ERROR: rv=0x%08X: initializing encryption:\n", (unsigned int)rv);
    return false;
}


rv = pfunc11->C_Encrypt(session, (CK_BYTE_PTR)clear, (CK_ULONG)buf_len, NULL, pulEncryptedDataLen);
if (rv != CKR_OK) 
{                                   
    printf("ERROR: rv=0x%08X: derror getting encryption data buffer length:\n", (unsigned int)rv);
    return false;
}

我在这里做错了什么?

这是我的机制定义 -

CK_MECHANISM myMechanism = {CKM_AES_CBC_PAD, (CK_VOID_PTR)"01020304050607081122334455667788", (CK_ULONG)16};
CK_MECHANISM_PTR pMechanism = &myMechanism;

1 个答案:

答案 0 :(得分:0)

您的pulEncryptedDataLen可能为NULL,导致CKR_ARGUMENTS_BAD

最好使用例如:

CK_ULONG ulEncryptedDataLen;
...
rv = pfunc11->C_Encrypt(session, (CK_BYTE_PTR)clear, (CK_ULONG)buf_len, NULL, &ulEncryptedDataLen);

足以存储单部分加密的加密结果的字节数存储在ulEncryptedDataLen中。

另请注意,传递IV值的方式不正确,因为"01020304050607081122334455667788"会产生ASCII字符串(将IV设为30313032303330343035303630373038 - 这可能不是您想要的。)

要获得正确的IV使用"\x01\x02\x03\x04\x05\x06\x07\x08\x11\x22\x33\x44\x55\x66\x77\x88"

祝你好运!