如何在不包含奇怪字符的情况下用XOR加密字符串



以下代码运行良好,但我希望不要在加密字符串中包含奇怪的字符,例如'\x03'。如何做到这一点?

string XOR_Encryption(string toBeEncrypted, string sKey)
{
string sEncrypted(toBeEncrypted);
unsigned int iKey(sKey.length()), iIn(toBeEncrypted.length()), x(0);
for (unsigned int i = 0; i < iIn; i++)
{
sEncrypted[i] = toBeEncrypted[i] ^ sKey[x];
if (++x == iKey) { x = 0; }
}
return sEncrypted;
}

用法:

string message = "gbpi";
string Key("Q4s4R4t");
string encrypted_message = XOR_Encryption(message, Key);
cout << "encoded: " << encrypted_message << endl;
string decryptedMessage = XOR_Encryption(encrypted_message, Key);
cout << "decoded: " << decryptedMessage << endl;

参考@kelalaka的建议,这里有一个使用十六进制编码的解决方案:

#include "stdafx.h"
#include <stdio.h>
#include <conio.h>
#include <string>
#include <stdlib.h>
#include <iostream>
string XOR_Encryption(string toBeEncrypted, string sKey)
{
string sEncrypted(toBeEncrypted);
unsigned int iKey(sKey.length()), iIn(toBeEncrypted.length()), x(0);
for (unsigned int i = 0; i < iIn; i++)
{
sEncrypted[i] = toBeEncrypted[i] ^ sKey[x];
if (++x == iKey) { x = 0; }
}
return sEncrypted;
}
void stream2hex(const string str, string& hexstr, bool capital = false)
{
hexstr.resize(str.size() * 2);
const size_t a = capital ? 'A' - 1 : 'a' - 1;
for (size_t i = 0, c = str[0] & 0xFF; i < hexstr.size(); c = str[i / 2] & 0xFF)
{
hexstr[i++] = c > 0x9F ? (c / 16 - 9) | a : c / 16 | '0';
hexstr[i++] = (c & 0xF) > 9 ? (c % 16 - 9) | a : c % 16 | '0';
}
}
void hex2stream(const string hexstr, string& str)
{
str.resize((hexstr.size() + 1) / 2);
for (size_t i = 0, j = 0; i < str.size(); i++, j++)
{
str[i] = (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) << 4, j++;
str[i] |= (hexstr[j] & '@' ? hexstr[j] + 9 : hexstr[j]) & 0xF;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
string text = "text";
string Key("password");
string encrypted_message = XOR_Encryption(text, Key);
stream2hex(encrypted_message, encrypted_message, true);
cout << "encoded: " << encrypted_message << endl;
hex2stream(encrypted_message, encrypted_message);
string decryptedMessage = XOR_Encryption(encrypted_message, Key);
cout << "decoded: " << decryptedMessage << endl;
getch();
return 0;
}

最新更新