...之后我不知道该使用什么:CryptoPP :: ArraySource?CryptoPP :: StringSource?
在此之后,使用PK_EncryptorFilter
进行RSA加密器;并使用ArraySource
对您要加密的密钥进行加密。 ArraySource
只是StringSource
的typedef,因此您实际上只是使用了StringSource
。
代码将类似于以下内容。 我没有运行示例,请修复拼写错误。
SecByteBlock key(AES::MAX_KEYLENGTH);
rng.GenerateBlock(key, key.size());
...
RSAES_OAEP_SHA_Encryptor encryptor(publicKey);
...
ArraySource as(key, key.size(), true,
new PK_EncryptorFilter(rng, encryptor,
new FileSink("session-key.enc")));
您可以使用类似以下方式将其写入到
std::string
中:
std::string session_key;
ArraySource as(key, key.size(), true,
new PK_EncryptorFilter(rng, encryptor,
new StringSink(session_key)));
你还可以使用
ByteQueue
来进行更高级的操作。
Redirector
打破了所有权链。另请参见Crypto++ wiki上的
Redirector
。
ByteQueue queue;
ArraySource as(key, key.size(), true,
new PK_EncryptorFilter(rng, encryptor,
new Redirector(queue)));
ByteQueue
很酷,因为它们包装了SecByteBlock
。一旦在ByteQueue
中,您可以使用TransferTo
和CopyTo
移动字节:
ByteQueue queue;
ArraySource as(key, key.size(), true,
new PK_EncryptorFilter(rng, encryptor,
new Redirector(queue)));
FileSink sink1("session-key.enc");
queue.CopyTo(sink1);
HexEncoder encoder(new FileSink(std::cout));
queue.CopyTo(encoder);
SecByteBlock block(queue.MaxRetrievable());
ArraySink sink2(block, block.size());
queue.TransferTo(sink2);
你可能也会对Crypto++维基上的
Pipelines感兴趣。你在上面看到的是管道中使用的源、过滤器和汇。
如果这个变量应该保存加密后的对称密钥,那么它太小了:
SecByteBlock cipher(AES::MAX_KEYLENGTH);
请看Crypto++维基上的
RSA加密方案。cipher需要设置为
encryptor.CiphertextLength(AES::MAX_KEYLENGTH);
,大致等于RSA模量大小减去OAEP格式化和填充的50个字节。保留HTML标签。
(comment) > Now I am trying to add the part to decrypt it using the private key... Is this correct ?
StringSource(readed_key, true,
new PK_DecryptorFilter(rng, decryptor, new
FileSource("sessionkey.enc")));
好的,过滤器部分是正确的(PK_DecryptorFilter
部分)。在 Crypto++ 中,数据从源流向汇。因此,一般模式如下所示。它被称为 Pipeline。
Source(..., new Filter(..., new Filter(..., new Sink(...))));
通常您需要像以下这样的内容。
Redirector
打破了所有权链。另请参见 Crypto++ wiki 上的
Redirector
。
// decrypted, in-memory
SecByteBlock session_key(AES::MAX_KEYLENGTH);
ArraySink sink(session_key, session_key.size());
FileSource fs("sessionkey.enc", true,
new PK_DecryptorFilter(rng, decryptor,
new Redirector(sink)));
(注释) > ... 然后比较原始数据 ...
您可以使用VerifyBufsEqual
在几乎恒定的时间内比较两个字节缓冲区。同样,请参阅Crypto++维基百科。
ArraySource
更为合理。密钥的加密也称为密钥包装,但在互联网上快速搜索并没有直接的结果。由于Crypto++是一个软件库,加密字节或密钥几乎没有区别,这就解释了为什么缺少此方面的示例代码。 - Maarten Bodewes