使用 XOR,解密与加密完全相同。通过xor_encrypt 方法再次运行相同密钥的加密字符串),您将获得纯文本。
警告 1:空字符
需要注意的一点:如果字符串中的字符与键中的相应字符匹配,则您的结果将是'\0'。这将被您当前的代码解释为“字符串结尾”,并会停止解密。为了避免这种情况,您需要将“实际”字符串的长度作为参数传递给您的函数。
警告 2:快捷键
您还需要确保不会超出密钥的末尾 - 如果纯文本很长,您可能需要重复密钥。您可以使用 % 运算符来执行此操作 - 只需从头开始回收密钥即可。
以下是展示这些技术的完整示例:
#include <stdio.h>
#include <string.h>
void xor_encrypt(char *key, char *string, int n)
{
int i;
int keyLength = strlen(key);
for( i = 0 ; i < n ; i++ )
{
string[i]=string[i]^key[i%keyLength];
}
}
int main(void) {
char plain[] = "This is plain text";
char key[] = "Abcdabcdabciabcdabcd";
int n = strlen(plain);
// encrypt:
xor_encrypt(key, plain, n);
printf("encrypted string: \n");
for(int ii = 0; ii < n; ii++) {
if(plain[ii] > 0x32 && plain[ii] < 0x7F ) printf("%c", plain[ii]);
else printf(" 0x%02x ", plain[ii]);
}
printf("\n");
// **** if you include this next line, things go wrong!
n = strlen(plain);
xor_encrypt(key, plain, n);
printf("after round trip, plain string is '%s'\n", plain);
}
这(没有意识到 kay == 字符串的问题)会导致解密被截断(plain 中的 i 与 key 中的相同字母匹配):
encrypted string:
0x15 0x0a 0x0a 0x17 A 0x0b 0x10 D 0x11 0x0e 0x02 0x00 0x0f B 0x17 0x01 0x19 0x16
after round trip, plain string is 'This is pla'
省略我上面标记的那行(即,保持n 的值作为字符串的原始长度),你的结果是
encrypted string:
0x15 0x0a 0x0a 0x17 A 0x0b 0x10 D 0x11 0x0e 0x02 0x00 0x0f B 0x17 0x01 0x19 0x16
after round trip, plain string is 'This is plain text'
完全符合您的预期。