6

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

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

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

4

3 回答 3

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

现在您只需要将字节传递给 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;
}
?>

如果您愿意,还可以将 PKCS#8 转换为 C++ 中的 PEM。从 PHP 代码中可以看出,该算法非常简单。

OpenSSL 现在非常流行。我认为没有任何理由将 Crypto++ 用于此类常见的加密应用程序。

于 2009-09-03T09:06:28.227 回答
1

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

是的。除了 X.509 和 PKCS #8 编码密钥(ZZ Coder 的回答)之外,您还可以使用 PEM 编码密钥,包括加密密钥。2014 年 7 月,为 OpenSSL 互操作项目捐赠了对 PEM 编码密钥的支持。

要使用 PEM 编码的密钥,您需要获取 Crypto++ PEM 包并重新编译库。PEM Pack 不是 Wei Dai 在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 上的Category:Patch页面。

于 2015-02-18T00:16:16.227 回答
0

试试这个链接: http ://www.cryptopp.com/fom-serve/cache/62.html

看起来您需要使用 PKCS#8 并将 DER 格式转换为 PEM 格式才能使用 OpenSSL 中的密钥。我不确定您是否可以同时使用一个文件。

我只使用过 OpenSSL,所以我不确定 Crypto++ 有哪些选项。我通过在 Google 上搜索这些术语找到了上面的链接:Crypto++ RSA OpenSSL。

DER 是 OpenSSL 的密钥和证书的二进制格式。

PEM 是 OpenSSL 的文本格式。

于 2009-08-31T16:57:02.280 回答