我在arduino环境中工作。我有一个结构定义如下。该结构最终将被加密并通过无线电链路层无线发送。它长达32个字节。
struct SENSORTYPE{
int sensor1:8;
int sensor2:8;
int sensor3:8;
int sensor4:8;
};
struct SENSOR{
float sensor1;
float sensor2;
float sensor3;
float sensor4;
};
struct HEADER{
byte type;
short id;
short to;
short from;
byte version;
long _buff;
SENSORTYPE sensortype;
SENSOR sensor;
};
HEADER header;
我有一个XTEA加密/解密例程,其定义如下,并经过验证可以正常工作。它在两个32位块上运行。
void xteaEncrypt( unsigned long v[2])
void xteaDecrypt(unsigned long v[2])
我要做的是通过xteaEncrypt运行header
。我正在将我的结构转换为两个32位数字。以下是我到目前为止的情况。
#define BLOCK_SIZE 8
header.type = 1; //test value
header._buff = 1; //test value
byte data[BLOCK_SIZE]; //8 byte buffer to encrypt/decrypt
byte buff[32]; //32 byte buffer to put encrypted/decrypted data into
for (uint32_t i = 0; i < 4; i++){ //4 times (4 * 8 = 32)
memcpy(data, &header+(i*BLOCK_SIZE), BLOCK_SIZE); //copy 8 bytes from header struct into data
xteaEncrypt((uint32_t*)data); //encrypt data
memcpy(&buff+(i*8), data, BLOCK_SIZE); //put encrypted data into the new buffer
}
memcpy(&header, &buff, sizeof(header)); //copy into original header for convenience
//now decrypt it back
for (uint32_t i = 0; i < 4; i++){
memcpy(data, &header+(i*BLOCK_SIZE), BLOCK_SIZE);
xteaDecrypt((uint32_t*)data);
memcpy(&buff+(i*8), data, BLOCK_SIZE);
}
memcpy(&header, &buff, sizeof(header));
加密后header.type = 0xee和header._buff = C0010000。解密后,header.type = 1和_buff仍然= C0010000所以看起来我的memcpy'ing有一个错误,但我找不到它。任何帮助将不胜感激。这个对我来说特别难以调试。如果我对此完全错误,请告诉我并指出正确的方向。
答案 0 :(得分:1)
你被指针运算绊倒了。请考虑代码段&header+(i*BLOCK_SIZE)
。您显然希望发生的是,您将获得一些地址,我们称之为addr
,然后在其中添加一些小数字来计算新地址,即
finalAddress = addr + (i * 8);
但是因为&header
是指向struct HEADER
的指针,编译器所做的实际计算是
finalAddress = addr + (sizeof(struct HEADER) * i * 8);
结果是一个远远超过任何i
大于0的标题末尾的地址。&buff+(i*8)
发生同样的事情,因为&buff
是指向32的指针字节。
要解决此问题,我建议使用char *
的中间变量,例如
char *headAddress = (char *)&header;
char *buffAddress = (char *)&buff;
for (uint32_t i = 0; i < 4; i++)
{
memcpy(data, headAddress+(i*BLOCK_SIZE), BLOCK_SIZE);
xteaEncrypt((uint32_t*)data);
memcpy(&buffAddress+(i*BLOCK_SIZE), data, BLOCK_SIZE);
}