gpt4 book ai didi

c++ - 我将如何从字符串/字节数组或任何其他容器加载私钥/公钥

转载 作者:可可西里 更新时间:2023-11-01 18:08:54 28 4
gpt4 key购买 nike

是否可以将 RSA 私钥/公钥存储在源代码中,例如 byte[]string 或任何其他 container 并使用此 key 进行加密/解密?

文件中的解码函数如下所示:

void Decode(const string& filename, BufferedTransformation& bt)
{
// http://www.cryptopp.com/docs/ref/class_file_source.html
FileSource file(filename.c_str(), true /*pumpAll*/);

file.TransferTo(bt);
bt.MessageEnd();
}

这不是我想要的从文件加载 key 。

我知道这是可能的,因为我可以使用 AutoSeededRandomPool 创建 key 。

我只是不知道如何使用现有的。

也许我忽略了文档中的这一部分。

最佳答案

Crypto++ Keys and FormatsCrypto++ RSA Cryptography可能感兴趣的页面。

如果您像这样生成 RSA 参数:

AutoSeededRandomPool rng;

InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rng, 2048);

您可以使用 DEREncodeBERDecode InvertibleRSAFunction 的方法分别对所有参数进行编码和解码:

{
FileSink output("rsaparams.dat");
params.DEREncode(output);
}

InvertibleRSAFunction params2;
{
FileSource input("rsaparams.dat", true);
params2.BERDecode(input);
}

要分别编码/解码私有(private)和公共(public) Material ,请使用 DEREncodeBERDecode RSA::PrivateKey 上的方法和 RSA::PublicKey对象本身:

// Initialize keys from generated params
RSA::PrivateKey rsaPrivate(params);
RSA::PublicKey rsaPublic(params);

// Write keys to file
{
FileSink output("rsaprivate.dat");
rsaPrivate.DEREncode(output);
}
{
FileSink output("rsapublic.dat");
rsaPublic.DEREncode(output);
}

// Read keys from file into new objects
RSA::PrivateKey rsaPrivate2;
RSA::PublicKey rsaPublic2;
{
FileSource input("rsaprivate.dat", true);
rsaPrivate2.BERDecode(input);
}
{
FileSource input("rsapublic.dat", true);
rsaPublic2.BERDecode(input);
}

FileSourceFileSink只是您可以使用的示例源和接收器对象。编码/解码例程采用 BufferedTransformation对象作为参数,因此您可以使用该接口(interface)的任何其他合适的实现。

例如, ArraySink 可用于将数据写入您提供的内存缓冲区,并且 StringSource (also aliased as ArraySource )可用于从缓冲区读取。

这里有一些代码显示了 ArraySink 的使用和 ArraySource通过 std::vector<byte> 往返私钥 Material :

RSA::PrivateKey rsaPrivate(params);
std::vector<byte> buffer(8192 /* buffer size */);

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's answer 以获取通过使用 ByteQueue 避免固定大小缓冲区的示例)。

另一个使用 std::string 的例子存储 key Material 并使用 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();

然后这些可以恢复到新的 InvertibleRSAFunctionRSA::*Key从文件或容器中读取实例时,使用相应的设置方法( SetModulus()SetPrime1() 等)。

关于c++ - 我将如何从字符串/字节数组或任何其他容器加载私钥/公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29050575/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com