2

我在使用 cryptoki 库编写一个小测试程序时遇到了一些问题。我想(必须)掌握 RSA 私钥(所有参数)。我考虑过要么生成密钥然后提取参数,要么使用已经生成的参数手动设置密钥。到目前为止,我没有得到任何工作。代码在文章末尾。


萃取

我知道有C_GetAttributeValue()可以用来提取公共指数或模数等属性。这适用于公钥和私钥对象,但是当我尝试从私钥对象中提取私有参数时出现CKR_ATTRIBUTE_SENSITIVE错误。有没有办法提取这些属性?登录会话或初始化期间可以/是否必须设置某些参数?

手动设置密钥

我的第二种方法是从文件中读取密钥材料(使用 OPENSSL 生成),并使用它通过C_CreateObject()生成密钥对象。该文件包含所有 RSA 参数 (n,e,d,p,q,dmp1,dmq1,iqmp)。阅读后,我将它们从 ASCII 转换为十六进制表示并将它们存储在CK_BYTE[]中。到目前为止,一切都很好。现在,当我将所有这些传递给C_CreateObject()以创建私钥时,我会收到CKR_ATTRIBUTE_VALUE_INVALID错误消息。使用公共参数创建公共密钥对象的方法相同。我验证了在创建的公钥对象上使用C_GetAttributeValue() 。如果以这种方式甚至可以生成私钥对象,我还缺少什么?我想无论是否提供密钥材料,C_GenerateKeyPair()总是会生成新的密钥,对吧?


C代码

这就是我尝试使用以下方法创建私钥对象的方法:

CK_OBJECT_HANDLE hPrivateKeys[NUMKEYS];
CK_KEY_TYPE kType= CKK_RSA;
CK_OBJECT_CLASS kClass = CKO_PRIVATE_KEY;
CK_BYTE id[] = {123};
CK_UTF8CHAR label[] = "An RSA private key object";

// sn,sd,se, etc contain the length of the respective parameter
CK_ATTRIBUTE privateKeyTemplate[] = {
            {CKA_CLASS, &kClass, sizeof(kClass)},
            {CKA_KEY_TYPE, &kType, sizeof(kType)},
            {CKA_TOKEN, &false, sizeof(false)},
            {CKA_PRIVATE, &false, sizeof(false)},
            {CKA_SENSITIVE, &false, sizeof(false)},
            {CKA_EXTRACTABLE, &true, sizeof(true)},
            {CKA_ID, id, sizeof(id)},
            {CKA_SUBJECT, NULL_PTR, 0},
            {CKA_DECRYPT, &true, sizeof(true)},
            {CKA_SIGN, &true, sizeof(true)},
            {CKA_LABEL, label, sizeof(label)-1},
            {CKA_ID, id, sizeof(id)},
            {CKA_MODULUS, modulus, sn},
            {CKA_PUBLIC_EXPONENT, publicExponent, se},
            {CKA_PRIVATE_EXPONENT, privateExponent, sd},
            {CKA_PRIME_1, prime1, sp},
            {CKA_PRIME_2, prime2, sq},
            {CKA_EXPONENT_1, exponent1, sdmp1},
            {CKA_EXPONENT_2, exponent2, sdmq1},
            {CKA_COEFFICIENT, coefficient, siqmp}
    };

    CK_ATTRIBUTE publicKeyTemplate[] = {
            {CKA_ENCRYPT, &true, sizeof(true)},
            {CKA_VERIFY, &true, sizeof(true)},
            {CKA_WRAP, &true, sizeof(true)},
            {CKA_MODULUS_BITS, &modulusBits, sizeof(modulusBits)},
            {CKA_PUBLIC_EXPONENT, publicExponent, se},
            {CKA_MODULUS, modulus, sn}
    };

rv = pFunctionList->C_CreateObject(hSession, privateKeyTemplate, NUM_ELEM(privateKeyTemplate), &hPrivateKeys[j]);
4

1 回答 1

0

您生成密钥对然后将其读出的想法很好,但是您应该CKA_SENSITIVE在私钥的模板中将属性设置为 false。请注意,如果支持此类功能,它始终取决于令牌本身。

通常在从令牌中提取私钥信息时,您希望对其进行加密。密钥的加密称为包装,敏感信息的可能提取由CKA_EXTRACTABLE属性管理。

阅读后,我将它们从 ASCII 转换为十六进制表示并将它们存储在 CK_BYTE[] 中。

PKCS#11 令牌接口精确地指定了如何编码/解码属性。只是随意尝试格式不会产生任何结果。

于 2015-05-16T11:25:10.890 回答