【问题标题】:Extract or set private key parameters in cryptoki library在cryptoki库中提取或设置私钥参数
【发布时间】:2015-05-15 10:41:22
【问题描述】:

我在使用 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]);

【问题讨论】:

  • 嗨 Rick,你找到解决办法了吗?

标签: c cryptography nss


【解决方案1】:

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

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

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

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

【讨论】:

  • 我将 CKA_SENSITIVE 属性设置为 false。还是行不通。我不想包装密钥,我希望能够读取密钥值,因此我知道 d、p、q 等。“请注意,如果支持此类功能,它总是取决于令牌本身。”意思是?有没有办法启用这种支持?
  • 您也许可以使用包装来提取密钥并将它们解开。 PKCS#11 是用于 C 应用程序的 API。 PKCS#11 令牌必须包含所有 API 方法,但它可能实际上并未实现所有可能的功能。例如。智能卡通常限制自己使用 RSA 密钥进行搜索和签名生成/解密。
  • 嗨 RIck,你能找到解决办法吗?
  • 不,抱歉。我不是
猜你喜欢
  • 2011-03-12
  • 2019-07-19
  • 1970-01-01
  • 2015-07-07
  • 2011-09-09
  • 2011-07-31
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多