在我的 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
,但我只对公钥感兴趣。我省略了私有模板。这里有什么问题?