CBCモードのAESとCrypto++ライブラリを使用してファイルを暗号化(および復号化)しようとしています
これが私がすでにやったことです:
using namespace CryptoPP;
AutoSeededRandomPool rnd;
//generating the key and iv
SecByteBlock key(AES::MAX_KEYLENGTH);
rnd.GenerateBlock(key, key.size());
byte iv[AES::BLOCKSIZE];
rnd.GenerateBlock(iv, AES::BLOCKSIZE);
ファイルを暗号化するには、ファイルをバイナリ モードで開き、コンテンツを文字列にダンプします。
std::ifstream fin(file_path, std::ios::binary);
if (!fin)
{
std::cout << "error";
}
std::ostringstream ostrm;
ostrm << fin.rdbuf();
std::string plaintext(ostrm.str());
fin.close();
次に、以前に生成したキーと iv を使用して、この文字列を暗号化します。
std::string ciphertext;
AES::Encryption aesEncryption(key, CryptoPP::AES::MAX_KEYLENGTH);
CBC_Mode_ExternalCipher::Encryption cbcEncryption(aesEncryption, iv);
StreamTransformationFilter stfEncryptor(cbcEncryption, new CryptoPP::StringSink(ciphertext));
stfEncryptor.Put(reinterpret_cast<const unsigned char*>(plaintext.c_str()), plaintext.length() + 1);
stfEncryptor.MessageEnd();
ここで、暗号化された文字列をファイルに書き込み、IV をそれと一緒に保存します。IV は秘密にしておく必要がないため、理想的には暗号文の最初または最後に
問題は次のとおりです。IV はバイト配列で、暗号文は文字列です。2 つのうちの 1 つを別の型に変換する必要がありますか、それともできますか :
std::ofstream fdout(file_path2, std::ios::binary);
if (!fdout)
{
std::cout << "error";
}
fdout << iv;
fdout << ciphertext;
fdout.close();
このファイルを解読しようとするとき、iv と暗号文を別々に抽出するにはどうすればよいですか? IV の長さは 16 バイトですが、ここでは完全に道に迷っており、どうすればよいかわかりません。