gpt4 book ai didi

c++ - 通过 PKCS#11 获取 CryptoAPI 公钥

转载 作者:行者123 更新时间:2023-11-30 04:14:14 27 4
gpt4 key购买 nike

在我的 C++ 程序中,我使用 CryptoAPI 创建了一个公钥/私钥对。

CryptGenKey(eTokenProv,ENCRYPT_ALGORITHM,CRYPT_EXPORTABLE,&k1)

key 存储在 eToken 中。是否可以使用 PKCS#11 获取公钥?先前创建的私钥是在使用以下搜索模板进行搜索后找到的:

    CK_ATTRIBUTE private_search[] = {
{CKA_PRIVATE, CK_TRUE, sizeof(CK_BBOOL)}
};

如果我将 CKA_PRIVATE 设置为 CK_FALSE,我将无法获取公钥。我还尝试了其他属性。有办法吗?

编辑

正如 owlstead 所建议的那样,我尝试从在前一个 session 中创建的 key 的模数和公共(public)指数开始创建一个公钥(在 CAPI 中,或者只是为了这个测试,在 PKCS11 中)。我从这些缓冲区中的私钥获得了模数和公共(public)指数:

CK_BYTE  modulus[128]; //if 1024bit
CK_BYTE publicExponent[4]; //4 Byte, according to public key blob

但是当我尝试按照以下说明创建一个带有 key 的新公共(public)时:

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);

我收到错误“无效模板”。问题是模数,因为没有它,我可以创建一个 key 对。我使用函数 C_GenerateKeyPair,但我只对公钥感兴趣。我省略了私有(private)模板。这里有什么问题?

最佳答案

CKA_PRIVATE 根本不表示私钥。

When the CKA_PRIVATE attribute is TRUE, a user may not access the object until the user has been authenticated to the token

相反,您应该寻找一个属性,例如具有 CKO_PUBLIC_KEYCKO_PRIVATE_KEY 值的 CKA_CLASS,可能使用其他属性进一步过滤您的结果.

如果您找不到任何 CKO_PUBLIC_KEY,那么我认为它不是在 token 中生成的( key 已导入,请检查是否设置了 CKA_LOCAL)。或者,它可能只是作为 session 对象创建的。最后它可能已被删除。

请注意,RSA 私钥通常确实包含公钥,因此您仍然可以仅从私钥对象构造公钥(当然,使用模数和公钥)。

关于c++ - 通过 PKCS#11 获取 CryptoAPI 公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19024809/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com