【发布时间】:2020-08-02 10:31:13
【问题描述】:
我是 Crypto++ 的新手,想将我在网上找到的文本加密代码“转换”为 Crypto++ 文件加密。基本上,图像文件只是一堆需要分块读取的文本,对吗?
我想读取一个图像文件并用 CryptoPP::AES 对其进行加密:
void encryptImage(std::filesystem::path const& file) {
std::ifstream inpf(file.string().c_str(), std::ios::binary);
CryptoPP::AutoSeededRandomPool rnd;
int keyLength = CryptoPP::AES::DEFAULT_KEYLENGTH; // 16 bytes = 128 bit key
int defBlockSize = CryptoPP::AES::BLOCKSIZE;
// Generate a random key
CryptoPP::byte key[CryptoPP::AES::DEFAULT_KEYLENGTH];
rnd.GenerateBlock(key, CryptoPP::AES::DEFAULT_KEYLENGTH);
// Generate a random IV
CryptoPP::byte iv[CryptoPP::AES::BLOCKSIZE];
rnd.GenerateBlock(iv, CryptoPP::AES::BLOCKSIZE);
char plainText[] = "Hello! How are you.";
int messageLen = (int)strlen(plainText) + 1;
//encrypt
CryptoPP::CFB_Mode<CryptoPP::AES>::Encryption cfbEncryption(key, CryptoPP::AES::DEFAULT_KEYLENGTH, iv);
cfbEncryption.ProcessData((CryptoPP::byte*)plainText, (CryptoPP::byte*)plainText, messageLen);
}
如果我正确理解这段代码,它会设置一个随机密钥和一个随机 IV(不知道这应该是什么意思)并使用 CFB_MODE::Encryption 方法从plainText 变量。
我现在的问题是...如何更改此代码,以便它加密我作为参数提供的文件并使用 std::ifstream 而不是文本读取?
【问题讨论】:
-
这不是 YouTube 或任何东西,请不要以 jojojo 开头,除非您想被视为 jojo。 C++ 程序员经常将“文本”与“二进制”混淆,因为
string和char[]可用于保存二进制数据。除此之外,你哪里失败了?上面的代码已经加密了一个文件,对吧? -
我的名字是约翰尼,这就是我多次这样做的原因,所以我想这只是习惯的力量。正如我提到的,我是 Crypto++ 的新手,所以我不确定我是否正确理解了代码,但我认为它加密了存储在 plainText[] 字符中的文本。我在函数顶部声明的文件只是我尝试从文件加密开始,但我不知道从哪里开始考虑图像的实际读取以及加密。
-
@MaartenBodewes 所以...我猜你也不知道如何加密图像文件。
标签: c++ encryption cryptography aes crypto++