在Crypto ++中加载PEM编码的私有RSA密钥

011*_*110 12 c++ encryption cryptography rsa crypto++

通常,用户将具有PEM编码的RSA私钥.Crypto ++要求这些密钥以DER格式加载.我一直要求人们事先使用openssl手动将他们的PEM文件转换为DER:

openssl pkcs8 -in in_file.pem -out out_file.der -topk8 -nocrypt -outform der
Run Code Online (Sandbox Code Playgroud)

这很好,但有些人不明白如何做到这一点,也不想做.所以我想在程序中自动将PEM文件转换为DER文件.

从PEM中剥离"----- BEGIN CERTIFICATE -----"和"----- END CERTIFICATE -----"还是一样简单,还是需要进行其他一些转换?我被告知在这些标记之间它只是b64编码的DER.以下是一些演示此问题的代码:

// load the private key
CryptoPP::RSA::PrivateKey PK;
CryptoPP::ByteQueue bytes;

try
{
    CryptoPP::FileSource File( rsa.c_str(), true, new CryptoPP::Base64Decoder() );
    File.TransferTo( bytes );
    bytes.MessageEnd();

    // This line Causes BERDecodeError when a PEM encoded file is used
    PK.Load( bytes );
}

catch ( CryptoPP::BERDecodeErr )
{
    // Convert PEM to DER and try to load the key again
}
Run Code Online (Sandbox Code Playgroud)

我想避免对openssl进行系统调用,并完全使用Crypto ++进行转换,以便用户可以提供格式和"正常工作".谢谢你的建议.

小智 7

是的,它是用Base64编码的DER流.但请注意,除了条带化BEGIN和END标记之外,如果是RSA密钥格式,还需要去除可能插入BEGIN标记和编码数据之间的任何标记.只有其余部分可以成功进行Base64解码.您似乎将完整的证书文件提供给解码器,并且需要修复.

  • 问题是您要求为您创建代码,这不是本网站的用途。你在提出一个不需要生成任何代码的问题后这样做,抢夺或回答了Lcount。 (2认同)