gpt4 book ai didi

c++ - 将 key 传递给 Crypto++ 中的 AES 解密

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:40:40 27 4
gpt4 key购买 nike

我已经为这个问题搜索了很多,但没有找到任何解决方案。在我当前的项目中,我必须使用发送者接收者表单来加密图像。所以我必须在发送方部分生成一个 key 来加密文件,并且我必须使用相同的 key (作为参数传递给 main)来获取原始数据,以继续执行程序。

我将 key 保存在一个文本文件中:

   void GetKeyAndIv() {
// Initialize the key and IV
prng.GenerateBlock( key, key.size() );
prng.GenerateBlock(iv, iv.size());
};

/*********************Begin of the Function***********************/
//Function encrypt a file (original file) and store the result in another file (encrypted_file)
void Encrypt(std::string original_file, std::string encrypted_file_hex,string encrypted_file,string binary) {

ofstream out;
out.open("Key.txt");
out.clear();
out<<"key = "<< key<<endl;
out<<"iv = "<< iv<<endl;

string cipher, encoded;

//Getting the encryptor ready
CBC_Mode< CryptoPP::AES >::Encryption e;
e.SetKeyWithIV( key, key.size(), iv );


try
{

ifstream infile(original_file.c_str(), ios::binary);
ifstream::pos_type size = infile.seekg(0, std::ios_base::end).tellg();
infile.seekg(0, std::ios_base::beg);

//read the original file and print it
string temp;
temp.resize(size);
infile.read((char*)temp.data(), temp.size());
infile.close();


// Encryption
CryptoPP::StringSource ss( temp, true,
new CryptoPP::StreamTransformationFilter( e,
new CryptoPP::StringSink( cipher )//,
//CryptoPP::BlockPaddingSchemeDef::NO_PADDING
) // StreamTransformationFilter
); // StringSource




std::ofstream outfile1(encrypted_file.c_str(),ios::out | ios::binary);
outfile1.write(cipher.c_str() , cipher.size());


}
catch( const CryptoPP::Exception& e )
{

cout <<"Encryption Error:\n" <<e.what() << endl;
system("pause");
exit(1);
}

然后我使用以下代码将它传递给客户端:

int main(int argc, char* argv[])
{
.....
string s1=argv[7];
SecByteBlock b1(reinterpret_cast<const byte*>(&s1[0]), s1.size());
string s2=argv[8];
SecByteBlock iv1(reinterpret_cast<const byte*>(&s2[0]), s2.size());
.....
}

尝试解密文件时出现错误,使用以下代码

   void Decrypt(std::string encrypted_file,SecByteBlock key,SecByteBlock iv,string decrypted_file) {


string recovered;
try
{
// Read the encrypted file contents to a string as binary data.
std::ifstream infile(encrypted_file.c_str(), std::ios::binary);
const std::string cipher_text((std::istreambuf_iterator<char>(infile)),
std::istreambuf_iterator<char>());
infile.close();


CBC_Mode< CryptoPP::AES >::Decryption d;
d.SetKeyWithIV( key, key.size(), iv );

解密错误:StreamTransformationFilter:发现无效的 PKCS #7 block 填充

这意味着我在解密过程中有不同的 key 。为什么会这样,是否有人可以帮助解决这个问题。

最佳答案

如果用于解密的 key 与用于加密的 key 不同,则会发生这种情况。

在解密过程中,在 PKCS#7 模式下,在解密最后一个 16 字节 block 之后,检查填充字节以了解消息的原始长度(不一定是 16 字节的倍数) :最后一个字节应该是0x01,或者最后两个字节应该等于0x02,或者最后三个字节应该等于0x03,...当解密 key 与加密 key 不同时,填充字节是未正确解密,这意味着解密时出现 PKCS#7 block 填充错误。

关于c++ - 将 key 传递给 Crypto++ 中的 AES 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51413024/

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