我正在尝试实现一个简单的XOR加密函数,该功能接收无符号的32位int(大端序(,以及四字母字符数组形式的密钥。然后,它将 int 的前八位与第一个字符进行 XOR 运算,然后将接下来的八位与下一个字符进行 XOR 运算,依此类推。以下是我所拥有的,尽管它输出 0 作为加密 8/10 次的结果:
unsigned int EncryptXOR(unsigned int x, unsigned char key[]) {
unsigned int result = 0; // int to hold final result
unsigned char* ascii; // pointer for chars in key array
unsigned char* num; // pointer for each 8 bit segment in x
unsigned int* encryption; // pointer for result
int i;
ascii = (unsigned char*)&key;
num = (unsigned char*)&x;
encryption = &result;
for (i=0; i<4; i++) {
*(encryption+i) = ascii[i] ^ num[i]; // for each byte in result, change to XOR of ascii and num
}
return result; // return changed result
}
我的逻辑是我抓取x(要加密的数字(和字符的片段,XOR它们,然后用这个新的XORed值设置结果的每个片段。然后我返回结果,因为加密指针应该更新了它的值,对吧?我是 C 的新手,所以我可能有一个明显的逻辑或编码错误,希望对更有经验的人来说是显而易见的。
您遇到的问题是此行中的指针算术:
*(encryption+i) = ascii[i] ^ num[i];
现在,由于encryption
变量被定义为int*
,因此加法i
将自动乘以编译器的sizeof(int)
。这样,如下所示的代码将按预期工作:
int array[4] = {1, 2, 3, 4};
int *ptr = &array[0];
*(ptr+2) = 5; // Will actually add "2 * sizeof(int)" to "ptr" - referencing THIRD element of array
您可以做的是将encryption
声明为指向unsigned char
的指针:
unsigned char* encryption = (unsigned char*)(&result);
请随时要求进一步澄清和/或解释;您可能还会发现本教程的指针算术部分很有帮助。
编辑:实现加密的更好/更安全的方法是使用位移(<<
(运算符将字符数组元素移动到result
变量的相应字节中,然后用x
参数一举XOR
。因此,由于您指定了大端格式,因此可以使用如下代码:
unsigned int EncryptXOR(unsigned int x, unsigned char key[]) {
unsigned int mask = (key[0] << 24) | (key[1] << 16) | (key[2] << 8) | key[3];
return x ^ mask;
}