gpt4 book ai didi

c++ - C++异或加密

转载 作者:搜寻专家 更新时间:2023-10-31 00:29:51 26 4
gpt4 key购买 nike

我已经实现了一种相当简单的方法来将字符串加密和解密到文件中,然后再返回。我使用的方法如下所示:

string encrypt(string msg, string key) {
string tmp(key);
while (key.size() < msg.size()) key += tmp;
for (std::string::size_type i = 0; i < msg.size(); ++i) msg[i] ^= key[i];
return msg;
}

string decrypt(string msg, string key) {
return encrypt(msg, key);
}

然而,我使用的一些键不是很有用。该字符串被正确加密并写入文件。但是当我尝试解密所有内容时(将文件加载到字符串中,解密,写回另一个文件)新文件明显更小并且不包含存储在其中的全部信息。

到目前为止我试过的键是:

string crypt = "abc";                           //works kinda well
string crypt = "_H84M!-juJHFXGT01X1*G6a$gEv"; //doesnt work
string crypt = "H84MjuJHFXGT01X1G6agEv"; //doesnt work either

我希望你能帮助我,并就如何选择可用的 key 给我任何建议。

文件处理代码:

ofstream temp;
temp.open("temp", ios::in | ios::trunc);
temp << encrypt(buffer, crypt);
temp.close();


ifstream in(file);
string content((std::istreambuf_iterator<char>(in)) (std::istreambuf_iterator<char>()));
ofstream plain;
plain.open(newfile, ios::in | ios::trunc);
plain << decrypt(content, crypt);
plain.close();

最佳答案

由于您的加密字符串中有二进制数据,因此您应该使用未格式化的 write方法而不是 operator<< :

ofstream os(...);
std::string encrypted = ...;
os.write( encrypted.data(), encrypted.size() );

请注意,如果您需要在一个文件中使用多个加密字符串,您可能希望在实际数据之前写入数据大小。然后你用 istream::read() 读取数据大小和数据:

void write( std::ostream &out, const std::string &encrypted )
{
size_t length = encrypted.size();
of.write( &length, sizeof( length ) );
of.write( encryped.data(), length );
}

std::string read( std::istream &in )
{
size_t length = 0;
in.read( &length, sizeof( length ) );
std::string str( length );
in.read( &str[0], length );
return str;
}

注意 2:将加密数据存储在 std::vector<char> 中可能是个好主意而不是 std::string ,这将避免许多问题——您将无法使用许多隐式假定字符串以 null 结尾的函数。

关于c++ - C++异或加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39298087/

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