【发布时间】:2020-08-12 16:33:15
【问题描述】:
我尝试在 C 中学习 XOR,并在 github 上找到了this example。
#include <stdio.h>
#include <string.h>
void encryptDecrypt(char *input, char *output) {
char key[] = {'K', 'C', 'Q'}; //Can be any chars, and any size array
int i;
for(i = 0; i < strlen(input); i++) {
output[i] = input[i] ^ key[i % (sizeof(key)/sizeof(char))];
}
}
int main (int argc, char *argv[]) {
char baseStr[] = "kylewbanks.com";
char encrypted[strlen(baseStr)];
encryptDecrypt(baseStr, encrypted);
printf("Encrypted:%s\n", encrypted);
char decrypted[strlen(baseStr)];
encryptDecrypt(encrypted, decrypted);
printf("Decrypted:%s\n", decrypted);
}
你能解释一下这个说法吗?
output[i] = input[i] ^ key[i % (sizeof(key)/sizeof(char))];
PS:如果我更改 char baseStr[] 中的语句,输出是错误的,为什么?例如,如果 baseStr 的值为 Test,则输出将为:
Encrypted: *?�
Decrypted:Test�&
编辑
如果有人想要这个程序的工作版本,这里是:#include <stdio.h>
#include <string.h>
#include <ctype.h>
void encryptDecrypt(char*, char*, char*);
int main()
{
char message[500];
char key[50];
printf("Enter the message: ");
fgets(message, 500, stdin);
message[strcspn(message, "\n")] = 0;
printf("Enter the key: ");
fgets(key, 50, stdin);
key[strcspn(key, "\n")] = 0;
for(size_t i = 0; i < strlen(key); ++i)
key[i] = toupper (key[i]);
putchar('\n');
char encryptedMessage[strlen(message) + 1];
memset(encryptedMessage, '\0', sizeof(encryptedMessage));
encryptDecrypt(message, encryptedMessage, key);
printf("Encrypted message: %s\n", encryptedMessage);
char decryptedMessage[strlen(message) + 1];
memset(decryptedMessage, '\0', sizeof(decryptedMessage));
encryptDecrypt(encryptedMessage, decryptedMessage, key);
printf("Decrypted message: %s\n", decryptedMessage);
return 0;
}
void encryptDecrypt(char *input, char *output, char *key)
{
for (int i = 0; i < strlen(input); ++i)
output[i] = input [i] ^ key [i % strlen(key)];
}
【问题讨论】:
-
格式良好的 C 字符串末尾有一个零字节,称为 NUL 终止符。因此,无论
baseStr中的内容如何,该程序都无法正常工作。你对原始字符串很幸运,对Test很不幸。要解决这个问题,encrypted和decrypted数组的大小需要大一字节,encryptDecrypt函数需要将 NUL 终止符放在字符串的末尾。
标签: c encryption xor