Xor String Encryption/Decryption 输出错误
Xor String Encryption/Decryption Output Error
我正在尝试对 Python 中的字符串进行异或加密,但由于某种原因,我在终端中得到了这个奇怪的输出。虽然解密运行得很好,但传输此数据似乎会导致错误。
第1行是明文字符串,2-3是加密字符串输出,4是解密后的加密字符串,5是加密字符串的字节串。
Hello world!
<
U
Hello world!
\x3c\x0\x1f\x18\x1b\x45\x4\x1b\x6\x9\x17\x55
以下是加密在 Python 中的工作方式。
def encrypt(self, plaintext: str) -> str:
ciphertext = ""
for i in range(len(plaintext)):
current = plaintext[i]
current_key = self.key[i%len(self.key)]
ciphertext += chr(ord(current) ^ ord(current_key))
return ciphertext
而实际调用加密方法如下。
tmp2 = tmp2.strip('"')
encryption = Encryption(self.key)
encrypted_string = encryption.encrypt(tmp2)
byte_string = encryption.to_byte_string(
encrypted_string.encode('utf-8'))
我试图对输出的最后一行(字节字符串)执行的操作是在 C++ 程序中解密此异或字符串。然而,该程序的输出只是给了我一个 H.
#define POLY_ENGINE_KEY "test"
static string Decrypt(string ciphertext)
{
string plaintext = ciphertext;
for (int i = 0; i < ciphertext.size(); i++)
plaintext[i] = ciphertext[i] ^ POLY_ENGINE_KEY[i % (sizeof(POLY_ENGINE_KEY) / sizeof(char))];
return plaintext;
}
非常感谢对此的一些帮助。
很可能 ciphertext
的 length/size 是 Decrypt()
中的 1。这可能是因为该加密文本在第二位包含 0x00
(NULL
) ascii 值。因此,将该字符数组转换为 std::string(我猜你在代码中做了什么)使一个字符串只有一个字符。仅采用字符数组的字符串构造函数期望字符数组以 NULL 终止。因此,当它在第二个位置遇到 NULL
时,它会创建一个字符串,其中只有第一个 character.You 可以尝试创建在字符数组旁边提及数组长度的字符串。像这些 -
char ciphered_bytes[] = {....};
int size = sizeof(ciphered_bytes)/sizeof(ciphered_bytes[0]);
std::string ciphertext(ciphered_bytes, size); // instead of only ciphertext(ciphered_bytes)
// Then call the Decrypt
std::string plaintext = Decrypt(ciphertext);
您可能还想将 Decrypt()
的 string
更改为 const string&
,因为您没有更改输入字符串 ciphertext
.
我正在尝试对 Python 中的字符串进行异或加密,但由于某种原因,我在终端中得到了这个奇怪的输出。虽然解密运行得很好,但传输此数据似乎会导致错误。
第1行是明文字符串,2-3是加密字符串输出,4是解密后的加密字符串,5是加密字符串的字节串。
Hello world!
<
U
Hello world!
\x3c\x0\x1f\x18\x1b\x45\x4\x1b\x6\x9\x17\x55
以下是加密在 Python 中的工作方式。
def encrypt(self, plaintext: str) -> str:
ciphertext = ""
for i in range(len(plaintext)):
current = plaintext[i]
current_key = self.key[i%len(self.key)]
ciphertext += chr(ord(current) ^ ord(current_key))
return ciphertext
而实际调用加密方法如下。
tmp2 = tmp2.strip('"')
encryption = Encryption(self.key)
encrypted_string = encryption.encrypt(tmp2)
byte_string = encryption.to_byte_string(
encrypted_string.encode('utf-8'))
我试图对输出的最后一行(字节字符串)执行的操作是在 C++ 程序中解密此异或字符串。然而,该程序的输出只是给了我一个 H.
#define POLY_ENGINE_KEY "test"
static string Decrypt(string ciphertext)
{
string plaintext = ciphertext;
for (int i = 0; i < ciphertext.size(); i++)
plaintext[i] = ciphertext[i] ^ POLY_ENGINE_KEY[i % (sizeof(POLY_ENGINE_KEY) / sizeof(char))];
return plaintext;
}
非常感谢对此的一些帮助。
很可能 ciphertext
的 length/size 是 Decrypt()
中的 1。这可能是因为该加密文本在第二位包含 0x00
(NULL
) ascii 值。因此,将该字符数组转换为 std::string(我猜你在代码中做了什么)使一个字符串只有一个字符。仅采用字符数组的字符串构造函数期望字符数组以 NULL 终止。因此,当它在第二个位置遇到 NULL
时,它会创建一个字符串,其中只有第一个 character.You 可以尝试创建在字符数组旁边提及数组长度的字符串。像这些 -
char ciphered_bytes[] = {....};
int size = sizeof(ciphered_bytes)/sizeof(ciphered_bytes[0]);
std::string ciphertext(ciphered_bytes, size); // instead of only ciphertext(ciphered_bytes)
// Then call the Decrypt
std::string plaintext = Decrypt(ciphertext);
您可能还想将 Decrypt()
的 string
更改为 const string&
,因为您没有更改输入字符串 ciphertext
.