... Я хотел бы автоматически конвертировать файлы PEM в файлы DER в программе.
В июле 2014 года для пакета PEM Pack был предоставлен *1005*.Библиотека Crypto ++.Пакет PEM - это частичная реализация шифрования сообщений, которая позволяет считывать и записывать ключи и параметры, закодированные в PEM, включая зашифрованные закрытые ключи.Дополнительные файлы включают в себя поддержку ключей RSA, DSA, EC, ECDSA и параметров Диффи-Хеллмана.
Это дополнение к библиотеке, а не часть самой библиотеки.Вы загружаете ZIP и добавляете пять исходных файлов в библиотеку.Затем вы создаете библиотеку (Crypto ++ автоматически подбирает их).ZIP содержит пять дополнительных исходных файлов, скрипт для создания тестовых ключей с использованием OpenSSL, программу на C ++ для тестирования чтения и записи ключей и скрипт для проверки ключей, написанных Crypto ++ с использованием OpenSSL.
Вот как выбудет использовать его:
CryptoPP::RSA::PrivateKey pk;
CryptoPP::FileSource file("<rsa-key-file.pem>", true);
CryptoPP::PEM_Load(file, pk);
CryptoPP::AutoSeededRandomPool prng;
bool = pk.Validate(prng, 3);
if (! valid)
throw ...
Если ключи зашифрованы, то вот как вы могли бы загрузить его. PEM Pack повторно реализует OpenSSL EVP_BytesToKey
, поэтому деривация ключей будет работать, и вы можете взаимодействовать:
CryptoPP::RSA::PrivateKey pk;
CryptoPP::FileSource file("<rsa-key-file.pem>", true);
std::string pass = "<super secret password>";
CryptoPP::PEM_Load(file, pk, pass.data(), pass.size());
CryptoPP::AutoSeededRandomPool prng;
bool = pk.Validate(prng, 3);
if (! valid)
throw ...
Также есть PEM_Save
, поэтому вы можете писать ключипрямо из Crypto ++.Например:
// Generate it or load it from somewhere
CryptoPP::RSA::PrivateKey pk = ...;
CryptoPP::FileSink file("<rsa-key-file.pem>", true);
CryptoPP::PEM_Save(file, pk);
и PEM_Save
для зашифрованного ключа (или ключа, который вы собираетесь шифровать):
// Generate it or load it from somewhere
CryptoPP::RSA::PrivateKey pk = ...;
CryptoPP::FileSink file("<rsa-key-file.pem>", true);
std::string pass = "<super secret password>";
CryptoPP::PEM_Save(file, pk, "AES-128-CBC", pass.data(), pass.size());
PEM_Load
делает не необходималгоритм, потому что он закодирован в инкапсулированном заголовке.PEM_Save
нужен алгоритм, потому что нет алгоритма по умолчанию.