在 C 中使用 32 位 int 和四个 char 数组进行 XOR 加密

XOR Encryption with a 32 bit int and four char array in C

我正在尝试实现一个简单的 XOR 加密函数,它接受一个无符号的 32 位 int(大端),以及一个四字母字符数组形式的密钥。然后它将 int 的前八位与第一个字符进行异或,然后将接下来的八位与下一个字符进行异或,等等。下面是我所拥有的,尽管它输出 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(要加密的数字)和字符的段,对它们进行异或,然后用这个新的异或值设置结果的每个段。然后我 return 结果是因为加密指针应该更新了它的值,对吧?我是 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);

随时要求进一步说明 and/or 解释;您可能还会发现 this tutorialPointer Arithmetic 部分很有帮助。

编辑:实现加密的better/safer方法是使用位移位(<<)运算符将字符数组元素移动到result的相应字节中变量,然后 XOR 用你的 x 参数(一口气)。因此,由于您指定了 Big-Endian 格式,您可以使用如下代码:

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;
}