在我的C++程序中,我使用CryptoAPI創建了公鑰/私鑰對。通過PKCS獲取CryptoAPI公鑰#11
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
,但我只對公鑰感興趣。我省略了私人模板。 這裏有什麼問題?
好的,謝謝你的回答!我做了一些測試,發現:私鑰(即CKA_CLASS = CKO_PRIVATE_KEY)不是本地的 - 可能是因爲它是通過CAPI創建的;沒有找到CKO_PUBLIC_KEY鍵。所以,正如你所建議的那樣,爲了重新構建公鑰,我們可以從私鑰模板中獲得CKA_MODULUS和CKA_PUBLIC_EXPONENT。我會試試看! – andret8
如果'CKA_LOCAL'沒有設置,那麼你可能想要再看看你的設置的安全性。如果私鑰在生成並保留在令牌中(如果密鑰管理方案不允許生成新密鑰,則可能用於加密備份除外),則它是最安全的。 –
如果我通過PKCS#11創建私鑰,則CKA_LOCAL設置爲true。也許,如果它沒有設置,它取決於一個CryptoAPI設置..我會檢查它。關於公鑰,我編輯我的問題與其他細節..任何其他建議?非常感謝 – andret8