XOR 加密,在 C 中使用 32 位 int 和 4 个字符数组



我正在尝试实现一个简单的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;
}

最新更新