В моей программе на C++ я создал пару открытых/закрытых ключей, используя CryptoAPI.Получить открытый ключ CryptoAPI через PKCS # 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, я не могу получить открытый ключ. Я также пробовал с другими атрибутами. Есть ли способ сделать это?
EDIT
Как owlstead предлагает, я попытался создать открытый ключ, начиная от модуля и общественного экспонента ключа, созданного в предыдущей сессии (в АЛО или, просто для этого теста, в 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