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