【发布时间】:2013-09-26 09:45:49
【问题描述】:
在我的 C++ 程序中,我使用 CryptoAPI 创建了一个公钥/私钥对。
CryptGenKey(eTokenProv,ENCRYPT_ALGORITHM,CRYPT_EXPORTABLE,&k1)
密钥存储在 eToken 中。 是否可以使用 PKCS#11 获取公钥?使用以下搜索模板搜索后找到先前创建的私钥:
CK_ATTRIBUTE private_search[] = {
{CKA_PRIVATE, CK_TRUE, sizeof(CK_BBOOL)}
};
如果我将CKA_PRIVATE 设置为 CK_FALSE,我将无法获取公钥。我还尝试了其他属性。
有办法吗?
编辑
正如 owlstead 建议的那样,我尝试从在前一个会话中创建的密钥的模数和公共指数开始创建一个公共密钥(在 CAPI 中,或者仅针对本次测试,在 PKCS11 中)。我从这些缓冲区中的私钥获得了模数和公共指数:
CK_BYTE modulus[128]; //if 1024bit
CK_BYTE publicExponent[4]; //4 Byte, according to public key blob
但是当我尝试使用以下说明创建带有密钥的新公共时:
CK_ATTRIBUTE publicKeyTemplate[] = {
{CKA_TOKEN, &yes, sizeof(true)},
{CKA_WRAP, &yes, sizeof(true)},
{CKA_ENCRYPT, &yes, sizeof(true)},
{CKA_MODULUS_BITS, &modulusBits, sizeof(modulusBits)},
{CKA_MODULUS, &modulus, sizeof(modulus)},
{CKA_PUBLIC_EXPONENT, &publicExponent, sizeof(publicExponent)}
CK_MECHANISM mechanism = {CKM_RSA_PKCS_KEY_PAIR_GEN, NULL_PTR, 0 };
rv = (*functions->C_GenerateKeyPair) (session, &mechanism, publicKeyTemplate, 6, privateKeyTemplate, 6, &hPublicKey, &hPrivateKey);
我收到错误“无效的模板”。问题是模数,因为没有它,我可以创建一个密钥对。我使用函数C_GenerateKeyPair,但我只对公钥感兴趣。我省略了私有模板。
这里有什么问题?
【问题讨论】:
-
如果你想创建一个你不应该使用
C_GenerateKeyPair的公钥,你应该使用C_CreateObject创建一个公钥对象。当然,如果您尝试创建具有预设模数的 new 密钥对,它会失败。请注意,EDIT 包含一个与原始问题相当不同的问题。哦,是的,我是“owlstead”——我已经停止使用我以前的昵称了 :)
标签: c++ cryptography cryptoapi pkcs#11