Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中使用32位int和四字符数组的XOR加密_C_Arrays_Encryption_Bit Manipulation_Xor - Fatal编程技术网

C语言中使用32位int和四字符数组的XOR加密

C语言中使用32位int和四字符数组的XOR加密,c,arrays,encryption,bit-manipulation,xor,C,Arrays,Encryption,Bit Manipulation,Xor,我试图实现一个简单的XOR加密函数,它接受一个无符号的32位int(big-endian),以及一个四字母字符数组形式的密钥。然后,它将int的前八位与第一个字符进行异或运算,然后将下八位与下一个字符进行异或运算,等等。下面是我得到的结果,尽管它在加密8/10次后输出0: unsigned int EncryptXOR(unsigned int x, unsigned char key[]) { unsigned int result = 0; // int to hold final re

我试图实现一个简单的XOR加密函数,它接受一个无符号的32位int(big-endian),以及一个四字母字符数组形式的密钥。然后,它将int的前八位与第一个字符进行异或运算,然后将下八位与下一个字符进行异或运算,等等。下面是我得到的结果,尽管它在加密8/10次后输出0:

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
}
unsigned int EncryptXOR(unsigned int x,unsigned char key[]){
unsigned int result=0;//保存最终结果的int
无符号字符*ascii;//键数组中字符的指针
无符号char*num;//x中每个8位段的指针
无符号int*加密;//结果指针
int i;
ascii=(无符号字符*)&键;
num=(无符号字符*)&x;
加密=&result;

对于(i=0;i您遇到的问题是这一行中的指针算法:

*(加密+i)=ascii[i]^num[i];
现在,由于
encryption
变量被定义为
int*
,因此编译器会自动将加数
i
乘以
sizeof(int)
。这样类似于以下代码的代码将按预期工作:

int数组[4]={1,2,3,4};
int*ptr=&数组[0];
*(ptr+2)=5;//将实际将“2*sizeof(int)”添加到“ptr”——引用数组的第三个元素
您可以将
加密
声明为指向
无符号字符
的指针:

无符号字符*加密=(无符号字符*)(&result);
请随时要求进一步的澄清和/或解释;您也可能会发现本手册的指针算法部分有所帮助


编辑:实现加密的更好/更安全的方法是使用位移位(
您遇到的问题是这一行中的指针算法:

*(加密+i)=ascii[i]^num[i];
现在,由于
encryption
变量被定义为
int*
,因此编译器会自动将加数
i
乘以
sizeof(int)
。这样类似于以下代码的代码将按预期工作:

int数组[4]={1,2,3,4};
int*ptr=&数组[0];
*(ptr+2)=5;//将实际将“2*sizeof(int)”添加到“ptr”——引用数组的第三个元素
您可以将
加密
声明为指向
无符号字符
的指针:

无符号字符*加密=(无符号字符*)(&result);
请随时要求进一步的澄清和/或解释;您也可能会发现本手册的指针算法部分有所帮助


编辑:实现加密的更好/更安全的方法是使用位移位(
有什么问题吗?
它似乎不起作用的确切含义是什么?
加密
成为一个
无符号字符*
,并将其视为
ascii
num
。现在,您正在使用它作为
int
的数组,可能会覆盖其他数据。此外,您应该使用固定大小的字符(
stdint.h
)整数而不是
无符号整数
,因为你依赖于它有一个特定的大小。有什么问题吗?
它似乎不起作用
的确切含义是什么?将
加密
设为
无符号字符*
,并将其视为
ascii
num
。现在,你将它用作的数组e> int
,可能会覆盖其他数据。此外,您应该使用固定大小(
stdint.h
)整数而不是无符号整数,因为你依赖于它有一个特定的大小。所以问题是,当我增加加密指针时,它实际上移动了4个字节的内存,而不是1个字节,因为它是一个整数?@BCool正是这一点!将它设为
char*
,然后它只移动1个字节。所以问题是当我增加加密指针时请记住,加密指针实际上移动了4个字节的内存,而不是1个字节,因为它是int?@BCool正是这一点!将它设为
char*
,然后它只移动1个字节。