Использование ключей RSA, сгенерированных Crypto ++ в OpenSSL

StackOverflow https://stackoverflow.com/questions/1357569

Вопрос

Есть ли способ использовать ключи RSA, которые я сгенерировал с помощью Crypto ++ API в OpenSSL?То, что я ищу, - это способ хранения ключей в формате, в котором как Crypto ++, так и OpenSSL могли бы легко их открыть.

Я пишу схему лицензирования и хотел бы проверять подписи и расшифровывать файлы с помощью Crypto ++ API, но для генерации файлов лицензий я бы хотел использовать веб-интерфейс (вероятно, с использованием PHP, который поддерживает только OpenSSL) для генерации и шифрования / подписи лицензий.

Я бы написал оба приложения, используя Crypto ++, и вызвал его из PHP, но поскольку закрытый ключ будет храниться в зашифрованном виде, приложению необходимо передать пароль, а передача его в командной строке мне не кажется хорошей идеей.

Это было полезно?

Решение

И Crypto++, и OpenSSL могут обрабатывать ключи в кодировке PKCS#8.В крипто++ вы можете генерировать ключи и конвертировать их в буфер PKCS#8 следующим образом:

AutoSeededRandomPool rng;
RSAES_OAEP_SHA_Decryptor priv(rng, 2048);
string der;
StringSink der_sink(der);
priv.DEREncode(der_sink);
der_sink.MessageEnd();

// der.data() is the bytes you need

Теперь вам просто нужно передать байты в PHP.Вы можете сохранить его в файл, отправить сообщением.

Единственная проблема заключается в том, что интерфейс OpenSSL PHP принимает только PEM-кодированный PKCS#8.Вы можете легко преобразовать буфер, закодированный в DER, в PEM, например, в PHP:

<?php
function pkcs8_to_pem($der) {

    static $BEGIN_MARKER = "-----BEGIN PRIVATE KEY-----";
    static $END_MARKER = "-----END PRIVATE KEY-----";

    $value = base64_encode($der);

    $pem = $BEGIN_MARKER . "\n";
    $pem .= chunk_split($value, 64, "\n");
    $pem .= $END_MARKER . "\n";

    return $pem;
}
?>

Если хотите, вы также можете преобразовать PKCS#8 в PEM на C++.Алгоритм очень прост, как видно из кода PHP.

OpenSSL сегодня очень распространен.Я не вижу причин использовать Crypto++ для таких распространенных криптоприложений, как это.

Другие советы

Есть ли способ использовать ключи RSA, которые я сгенерировал с помощью Crypto ++ API в OpenSSL?То, что я ищу, - это способ хранения ключей в формате, в котором как Crypto ++, так и OpenSSL могли бы легко их открыть.

ДА.В дополнение к кодированным ключам X.509 и PKCS # 8 (ответ ZZ Coder's), вы также можете использовать ключи в кодировке PEM, включая зашифрованные ключи.Поддержка ключей в кодировке PEM была предоставлена проекту в июле 2014 года для взаимодействия с OpenSSL.

Чтобы использовать ключи в кодировке PEM, вам необходимо получить Crypto ++ Упаковка PEM и перекомпилируйте библиотеку.Пакет PEM не является частью библиотеки Crypto ++, предоставленной Вэй Дай на Веб-сайт Crypto++.

Как только вы установите и перекомпилируете, это будет так же просто, как:

// Load a RSA public key
FileSource fs1("rsa-pub.pem", true);
RSA::PublicKey k1;
PEM_Load(fs1, k1);

// Load a encrypted RSA private key
FileSource fs2("rsa-enc-priv.pem", true);
RSA::PrivateKey k2;
PEM_Load(fs2, k2, "test", 4);

// Save an EC public key
DL_PublicKey_EC<ECP> k16 = ...;
FileSink fs16("ec-pub-xxx.pem", true);
PEM_Save(fs16, k16);

// Save an encrypted EC private key
DL_PrivateKey_EC<ECP> k18 = ...;
FileSink fs18("ec-enc-priv-xxx.pem", true);
PEM_Save(fs18, k18, "AES-128-CBC", "test", 4);

Ключи выглядят примерно так на диске:

$ cat rsa-pub.pem
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCg7ovcljEjZCFOdLWENBKE6FSk
Nke6OP79SMJABJw+JoEBpNddK6/v99IvA1qU76V0V4k8qLvhkVUtk9FArhhRsxeF
1fd8UVqgsT8j0YCVFcJ/ZA372ogpXyvc5aK9mZEiKE5TIF8qnDFFZiMWPrad1buk
hg+eFdo78QRLA5plEQIDAQAB
-----END PUBLIC KEY-----
$  
$ cat rsa-enc-priv.pem
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,E1A759E11CA515CE34B6E8CE5278C919

slMx02TMblahTedEKsfS+qYYo4nZFaqI3PhCRYmE5zUa9clHm7yo36wIk3oo52OB
f4AhOaJwiPQAbLe/kDHeP77iHd/4+hFNq/Haj6ahWRpXilLVOETLtefbzSGO8va3
ORnwQpPThs2V0EetPU3LB3QcA/XRjWDzyNa7+LydOjKwbQdZnF/jND5NCkEkncNM
iQJ1VWubN+Xs3Rx0CfLu5Chl1n7WnmCNMtLL/LtYeaR1SlRJa6BaF7hNHJJJ3+Jc
8curCKlpobs+XnlDfjyqgTXolkiepn95TnT7KSqi3BqVEpq/5LKMnkDJg6nwUR7A
w0jLNr1f8adWyBEj2Dp0D/jy8eDh65eHdJw4s8G5FZfBud1zWbvRQ3Ah70ISUKa3
4q/6z2vervPgoc+rMVYDvRf/mqa4LMXYhuygsyx50OgPldCC2d0cVVFCg/ljdEzO
UV5rSkK1Qczv8Nc1ZdY3fJA+qYIV8JqPPY+dJ2312R+myPi5Av0/69k8lZN5eIJk
SkiiFQmabhc+o6z4RFA52a3lOud3eGM9L5nbFQGc5COzQVZ6y8t06tLIp9Y5zjA4
KTgNncV5eq3Bau+cWXjP6pJRixFVfwIoy95mAur7B2P1iE4FXyZbvCovPL6vilT5
kSqAo7Znu0RpTjE36tWY6tFt+GU7k8EBrjA3Qi+8xxqyYtr57Ns+H/j+hhJTN8L7
IXoevwS81OPiB0Dmg6wLLXATG1+gCNXb8sd5U2eJhy4LOJA3y54CTgRnPXtM38CH
K+JvnDstyUl9IGTsgUz51ZzyJNZGU9Ro3pt/a3Cs5IJumaygZ0LQ44WBw9m/vja9
-----END RSA PRIVATE KEY-----
$  
$ cat ec-pub.pem
-----BEGIN PUBLIC KEY-----
MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEVwXjdIb2yy25QbIO0XiIHpySXwSpIAcz
v0Wdyq+fZ6BdJjs2jKvbs9pcRJn8yxlASWoz2R4NoHTZ2YokKsDfEg==
-----END PUBLIC KEY-----
$  
$ cat ec-enc-priv.pem
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,F1DBC73E26DCD310888932C2762B3512

nikex48SFvtNOIrOEDipwmxaghjn4jtrvwI3d1H/VNq9yp26WqFZxBJCUPFBFLjH
auA+AHeUo3BVkNQPs0VO4FD5xR50mtc2tCJizzhyTTTypLc3lRkxmD1MpeZnWRy2
70foVtNSvLL/QLJqNJGm/G9kl0xPN4zAfOq7Txoscnk=
-----END EC PRIVATE KEY-----

Похожие:о других полезных исправлениях Crypto ++ смотрите в Категория:Патч страница в Crypto++ wiki.

Попробуйте эту ссылку:http://www.cryptopp.com/fom-serve/cache/62.html

Похоже, вам нужно будет использовать PKCS#8 и преобразовать формат DER в PEM, чтобы иметь возможность использовать ключи в OpenSSL.Я не уверен, сможете ли вы использовать один файл для обоих.

Я использовал только OpenSSL, поэтому не уверен, какие варианты у вас есть с Crypto++.Я нашел ссылку выше, выполнив поиск в Google по этим терминам:Крипто++ RSA OpenSSL.

DER — это двоичный формат OpenSSL для ключей и сертификатов.

PEM — это текстовый формат OpenSSL.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top