我尝试使用C学习XOR算法。我在KyleBank's GitHub找到了一个很好的例子:
#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);
}
以上在Linux和gcc下运行良好。 但是,它不能在Windows下的Visual Studio中编译。
我正在使用Visual Studio 2017中包含的构建工具。
我做错了什么?
答案 0 :(得分:3)
Microsoft的编译器不支持C99 VLA(请参阅注释here)。数组大小必须是常量表达式。代码也被破坏,因为它无法容纳并在输出中放置一个nul终止符。
在这种情况下,可能会声明decrypted
和encrypted
:
char encrypted[sizeof(baseStr)] ;
...
char decrypted[sizeof(baseStr)] ;
encryptDecrypt()
因此修改了:
void encryptDecrypt(char *input, char *output) {
...
output[i] = 0 ;
}
最后,可以通过将i
声明为size_t
类型来清除签名的不匹配警告。
在Windows上,当然如果你想要更现代的C支持,你总是可以使用MinGW / GCC。或者如果你想坚持使用微软的编译器,你可以使用C ++和std::string
或std::vector
容器。
答案 1 :(得分:1)
使用malloc
进行动态内存分配。需要#include <stdlib.h>
char baseStr[] = "123";
char *encrypted = malloc(strlen(baseStr) + 1);
...
free(encrypted);
如前所述,您必须在末尾为空终止字符添加1。
char*
指针是一条信息,它显示字符串的开始位置。但它在哪里结束? strlen
和其他C函数不知道字符串的结束位置,因此它们会遍历所有字符,直到遇到'\0'
个字符。
为提高效率,请将strlen(input)
从循环中取出并仅计算一次:
void encryptDecrypt(char *input, char *output)
{
char key[] = { 'K', 'C', 'Q' };
int keysize = sizeof(key);
size_t i;
size_t len = strlen(input);
for(i = 0; i < len; i++)
output[i] = input[i] ^ key[i % keysize];
output[len] = 0; //will be same as output[i] = 0;
}
函数int main
应返回零。请注意,此方法不能被现代标准描述为“加密”。你可以称之为“混淆”。