Các trang Crypto++ Keys and Formats và Crypto++ RSA Cryptography có thể được quan tâm.
Nếu bạn đang tạo ra các thông số RSA như thế này:
AutoSeededRandomPool rng;
InvertibleRSAFunction params;
params.GenerateRandomWithKeySize(rng, 2048);
Bạn có thể sử dụng việc sử dụng các DEREncode
và BERDecode
phương pháp InvertibleRSAFunction
để mã hóa và giải mã tất cả các thông số tương ứng:
{
FileSink output("rsaparams.dat");
params.DEREncode(output);
}
InvertibleRSAFunction params2;
{
FileSource input("rsaparams.dat", true);
params2.BERDecode(input);
}
Để mã hóa/giải mã riêng tư và tài liệu công khai một cách riêng biệt, hãy sử dụng các phương pháp DEREncode
và BERDecode
trên RSA::PrivateKey
và RSA::PublicKey
đối tượng bản thân:
// 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);
}
FileSource
và FileSink
chỉ là ví dụ nguồn và chìm đối tượng mà bạn có thể sử dụng. Các thủ tục mã hóa/giải mã mất BufferedTransformation
các đối tượng làm tham số, vì vậy bạn có thể sử dụng bất kỳ triển khai phù hợp nào khác của giao diện đó.
Ví dụ: ArraySink
có thể được sử dụng để ghi dữ liệu vào bộ đệm bộ nhớ mà bạn cung cấp và StringSource
(also aliased as ArraySource
) có thể được sử dụng để đọc từ bộ đệm.
Dưới đây là một số mã cho thấy sử dụng ArraySink
và ArraySource
để khứ hồi vật liệu private key thông qua một std::vector<byte>
:
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);
(Xem thêm @jww's answer cho một ví dụ mà tránh bộ đệm kích thước cố định bằng cách sử dụng một ByteQueue
).
Và một ví dụ khác sử dụng std::string
để lưu trữ tài liệu chính và sử dụng lớp StringSink
để ghi điều này, tránh một số thao tác quản lý bộ đệm (chuỗi sẽ được tự động thay đổi kích thước để khớp với lượng dữ liệu được mã hóa). Lưu ý rằng đây vẫn là dữ liệu nhị phân mặc dù nó nằm trong đối tượng 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);
Ngoài ra, nếu bạn muốn kiểm soát các định dạng chính mình, bạn có thể sử dụng các phương pháp của đối tượng InvertibleRSAFunction
hoặc các đối tượng chủ chốt để trích xuất các thông số cá nhân (như thể hiện trong "Crypto ++ RSA Cryptography" liên kết ở trên) và sử dụng để trích xuất các giá trị cho việc lưu trữ ở định dạng của riêng bạn:
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();
Chất này có thể được phục hồi vào một mới InvertibleRSAFunction
hoặc RSA::*Key
dụ khi đọc từ tập tin hoặc container, bằng cách sử dụng các phương pháp setter tương ứng (SetModulus()
, SetPrime1()
, v.v.)
Trên thực tế , Tôi chỉ tự hỏi liệu vấn đề đã được chọn một nguồn/sink thích hợp (ví dụ 'ArraySink' /' ArraySource'instead của 'FileSource' /' FileSink'), không phải là mã hóa/giải mã của tài liệu chính như tôi đã đã trả lời. Bạn có thể làm rõ? – softwariness
@softwariness câu trả lời của bạn là thực sự tốt nhưng có nó là nhiều hơn về việc lựa chọn một nguồn thích hợp/sink: D Tôi không biết về ArraySink mặc dù O.o có thể giúp đỡ. Nếu bạn có thể bao gồm một cái gì đó về bồn cũng như trong câu trả lời của bạn tôi sẽ chấp nhận nó – deW1
Trả lời ngay bây giờ được cập nhật với một ví dụ cho thấy tài liệu chính vòng tròn thông qua một bộ nhớ đệm, và một số khác cho thấy các tài liệu quan trọng được lưu trữ trong một std :: string với StringSink/StringSource tránh một số việc quản lý bộ đệm. – softwariness