可能会对您感兴趣的是Crypto++ Keys and Formats和Crypto++ RSA Cryptography页面。
如果您正在生成RSA参数,可以像这样进行:
AutoSeededRandomPool rng;
InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rng, 2048);
你可以使用
InvertibleRSAFunction
的
DEREncode
和
BERDecode
方法来分别编码和解码所有参数:
{
FileSink output("rsaparams.dat");
params.DEREncode(output);
}
InvertibleRSAFunction params2;
{
FileSource input("rsaparams.dat", true);
params2.BERDecode(input);
}
若要单独编码/解码私钥和公钥材料,请在RSA::PrivateKey
和RSA::PublicKey
对象本身上使用DEREncode
和BERDecode
方法:
RSA::PrivateKey rsaPrivate(params);
RSA::PublicKey rsaPublic(params);
{
FileSink output("rsaprivate.dat");
rsaPrivate.DEREncode(output);
}
{
FileSink output("rsapublic.dat");
rsaPublic.DEREncode(output);
}
RSA::PrivateKey rsaPrivate2;
RSA::PublicKey rsaPublic2;
{
FileSource input("rsaprivate.dat", true);
rsaPrivate2.BERDecode(input);
}
{
FileSource input("rsapublic.dat", true);
rsaPublic2.BERDecode(input);
}
FileSource
和FileSink
只是您可以使用的示例源和汇对象。编码/解码例程接受BufferedTransformation
对象作为参数,因此您可以使用任何其他适当实现该接口的实现。
例如,ArraySink
可用于将数据写入您提供的内存缓冲区,而StringSource
(也称为ArraySource
)可用于从缓冲区中读取。
以下是一些代码示例,展示如何使用ArraySink
和ArraySource
通过std :: vector <byte>
往返传输私钥材料:
RSA::PrivateKey rsaPrivate(params);
std::vector<byte> buffer(8192 );
ArraySink arraySink(&buffer[0], buffer.size());
rsaPrivate.DEREncode(arraySink);
// Initialize variable with the encoded key material
// (excluding unwritten bytes at the end of our buffer object)
std::vector<byte> rsaPrivateMaterial(
&buffer[0],
&buffer[0] + arraySink.TotalPutLength());
RSA::PrivateKey rsaPrivate2;
ArraySource arraySource(
&rsaPrivateMaterial[0],
rsaPrivateMaterial.size(),
true);
rsaPrivate2.BERDecode(arraySource);
(另请参见@jww的答案,该答案通过使用ByteQueue
避免了固定大小的缓冲区,提供了一个示例)。
另一个例子使用std::string
存储密钥材料,并使用StringSink
类将其写入,这避免了部分缓冲区管理(字符串会自动调整大小以匹配编码的数据量)。请注意,即使它在std::string
对象中,这仍然是二进制数据。
RSA::PrivateKey rsaPrivate(params);
std::string rsaPrivateMaterial;
StringSink stringSink(rsaPrivateMaterial);
rsaPrivate.DEREncode(stringSink);
RSA::PrivateKey rsaPrivate2;
StringSource stringSource(rsaPrivateMaterial, true);
rsaPrivate2.BERDecode(stringSource);
如果您想自行控制格式,可以使用InvertibleRSAFunction
对象或密钥对象的方法来提取单个参数(如上面所示的"Crypto++ RSA Cryptography"链接),并使用这些参数来提取存储在自己格式中的值:
const Integer& n = params.GetModulus();
const Integer& p = params.GetPrime1();
const Integer& q = params.GetPrime2();
const Integer& d = params.GetPrivateExponent();
const Integer& e = params.GetPublicExponent();
当从文件或容器中读取这些内容时,可以使用相应的setter方法(SetModulus()
, SetPrime1()
等)将它们恢复为新的InvertibleRSAFunction
或RSA::*Key
实例。
ArraySink
/ArraySource
而不是FileSource
/FileSink
),而不是像我回答的那样对密钥材料进行编码/解码。你能澄清一下吗? - softwariness