gpt4 book ai didi

c++ - AES IV通过FileSource和FileSink进入文件

转载 作者:行者123 更新时间:2023-12-02 10:27:24 28 4
gpt4 key购买 nike

我需要使用crypto ++加密大文件(多GB)。我设法在帮助我创建以下2个函数的文档中找到一个示例:

bool AESEncryptFile(const std::string& clearfile, const std::string& encfile, const std::string& key) {

try {
byte iv[CryptoPP::AES::BLOCKSIZE] = {};
CryptoPP::CBC_Mode<CryptoPP::AES>::Encryption encryptor;
encryptor.SetKeyWithIV((unsigned char*)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH, iv);

CryptoPP::StreamTransformationFilter filter(encryptor);

CryptoPP::FileSource source(clearfile.c_str(), false);
CryptoPP::FileSink sink(encfile.c_str());

source.Attach(new CryptoPP::Redirector(filter));
filter.Attach(new CryptoPP::Redirector(sink));

const CryptoPP::word64 BLOCK_SIZE = 4096;
CryptoPP::word64 processed = 0;

while (!EndOfFile(source) && !source.SourceExhausted()) {
source.Pump(BLOCK_SIZE);
filter.Flush(false);
processed += BLOCK_SIZE;
}

filter.MessageEnd();
return true;
} catch (const CryptoPP::Exception& ex) {
return false;
}

}

bool AESDecryptFile(const std::string& encfile, const std::string& clearfile, const std::string& key) {

try {
byte iv[CryptoPP::AES::BLOCKSIZE] = {};
CryptoPP::CBC_Mode<CryptoPP::AES>::Decryption decryptor;
decryptor.SetKeyWithIV((unsigned char*)key.c_str(), CryptoPP::AES::DEFAULT_KEYLENGTH, iv);

CryptoPP::StreamTransformationFilter filter(decryptor);

CryptoPP::FileSource source(encfile.c_str(), false);
CryptoPP::FileSink sink(clearfile.c_str());

source.Attach(new CryptoPP::Redirector(filter));
filter.Attach(new CryptoPP::Redirector(sink));

const CryptoPP::word64 BLOCK_SIZE = 4096;
CryptoPP::word64 processed = 0;

while (!EndOfFile(source) && !source.SourceExhausted()) {
source.Pump(BLOCK_SIZE);
filter.Flush(false);
processed += BLOCK_SIZE;
}
.
filter.MessageEnd();
return true;
} catch (const CryptoPP::Exception& ex) {
return false;
}
}
这很好。在8 GB的文件上,我使用的内存很少。
但是正如您所看到的,IV是(目前为空)是硬编码的,我想:
  • 加密时,将其放在文件末尾。
  • 解密时:从文件中获取IV以初始化解密器。

  • 有没有办法用crypto ++做到这一点,还是应该在加密/解密过程之后/之前手动处理它?

    最佳答案

    由于所有不同的评论,这就是我设法做到的。如@Sam Mason所建议,我将iv放在文件的开头:
    因此,在开始加密之前,我将iv放在文件的开头:

    CryptoPP::ArraySource(iv, sizeof(iv), true,
    new CryptoPP::Redirector(sink)
    );
    // Encrypt
    然后在解密时,我将IV返回:
    unsigned char iv[CryptoPP::AES::BLOCKSIZE];
    CryptoPP::ArraySink ivSink(iv, sizeof(iv));
    source.Attach(new CryptoPP::Redirector(ivSink));
    source.Pump(CryptoPP::AES::BLOCKSIZE);
    // Decrypt
    给以后的读者的注意:不要在我的OP中使用空的show这样的IV,而是随机生成一个,例如:
    CryptoPP::AutoSeededRandomPool prng;
    unsigned char iv[CryptoPP::AES::BLOCKSIZE];
    prng.GenerateBlock(iv, sizeof(iv));

    关于c++ - AES IV通过FileSource和FileSink进入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63738572/

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