Openssl RSA Генерация ключей

У меня есть клиент, который общается с сервером, и связь зашифрована с использованием комбинации RSA и AES. Пара ключей RSA, которую я сгенерировал, была без ключевой фразы. Итак, чтобы сделать это безопасным, я недавно добавил фразу-пароль. Все работает нормально на стороне сервера, но сгенерированный PHP секретный ключ не содержит информации о шифровании, из-за чего я не могу загрузить его на стороне клиента. Ниже приведен код php:

    $passphrase = 'Hello World';

$config = array ("digest_alg" => "sha256","private_key_bits" => 2048,"private_key_type" => OPENSSL_KEYTYPE_RSA );
// Create the private and public key
$res = openssl_pkey_new ( $config );
/* Extract the private key from $res to $privKey */
openssl_pkey_export ( $res, $priv_key, $passphrase );
/* Extract the public key from $res to $pubKey */
$pub_key = openssl_pkey_get_details ( $res );
$pub_key = $pub_key["key"];
$pkey_pair = array ('priv_key' => $priv_key,'pub_key' => $pub_key );
var_dump($pkey_pair);

Вы можете примерить это на http://phpfiddle.org/ информация о шифровании отсутствует, как будто она это предполагает, поскольку она работает на стороне сервера!

Мой код на стороне клиента работает только тогда, когда в генерации ключа RSA не используется парольная фраза.

try
{
Botan::AutoSeeded_RNG rng;
Botan::DataSource_Memory privKeyMem(privKey);
Botan::RSA_PrivateKey *rsaKey = dynamic_cast     <Botan::RSA_PrivateKey*>
(Botan::PKCS8::load_key(privKeyMem, rng, passphrase.c_str()));
if(!rsaKey)
{
std::cout << "The loaded key is not a RSA key!\n";
return false;
}
....
.....
}
catch(...)
{
cout<<"Exception: could not load private key";
return false;
}

0

Решение

Экспорт ключа RSA с парольной фразой не приводит к тому, что сгенерированная пара ключей будет отличаться; он просто шифрует закрытый ключ, используя эту фразу-пароль. Если ваш клиентский код не может расшифровать зашифрованный ключ, не используйте парольную фразу.

Кроме того, код клиента, который вы используете в данный момент, пытается загрузить закрытый ключ формата PKCS8. Это неверно здесь; openssl_pkey_export() генерирует открытый и закрытый ключ в формате PEM.

1

Другие решения

Закрытые ключи не следует экспортировать, за исключением, возможно, целей резервного копирования / репликации для той же службы. Вы должны только экспортировать открытые ключи как клиента, так и сервера. Этим ключам нужно как-то доверять. Это можно сделать, внедрив их в сертификат, подписанный (самоподписанным) ЦС, которому доверяют как клиент, так и сервер.

Обратите внимание, что для транспортных протоколов AES CBC шифрование недостаточно. Вам нужно будет добавить защиту целостности и подлинности. Обычно это делается путем добавления (H) MAC.

Кажется, вы пытаетесь выполнить симметричное шифрование с использованием одной пары ключей RSA.

0