在OpenSSL上使用Crypto ++生成的RSA密钥

Var*_*gas 6 c++ encryption openssl rsa crypto++

有没有办法使用我在OpenSSL中使用Crypto ++ API生成的RSA密钥?我正在寻找一种方法来存储密钥的格式,Crypto ++和OpenSSL都可以轻松打开它们.

我正在编写许可方案,并希望使用Crypto ++ API验证签名和解密文件,但是要生成许可证文件,我想使用Web界面(可能使用PHP,它只支持OpenSSL)来生成和加密/签署许可证.

我会使用Crypto ++编写这两个应用程序并从PHP调用它,但由于私钥将以加密形式存储,因此必须将密码传递给应用程序并在命令行上传递它似乎不太好我的想法.

ZZ *_*der 5

Crypto ++和OpenSSL都可以处理PKCS#8编码密钥.在crypto ++中,您可以生成密钥并转换为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
Run Code Online (Sandbox Code Playgroud)

现在你只需要将字节传递给PHP.您可以将其保存在文件中,然后发送消息.

唯一的问题是PHP的OpenSSL接口只接受PEM编码的PKCS#8.您可以在PHP中轻松地将DER编码的缓冲区转换为PEM,

<?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;
}
?>
Run Code Online (Sandbox Code Playgroud)

如果您愿意,也可以使用C++将PKCS#8转换为PEM.从PHP代码可以看出,该算法非常简单.

OpenSSL如今非常流行.我没有看到任何理由将Crypto ++用于这样的常见加密应用程序.