【发布时间】:2023-03-22 14:25:01
【问题描述】:
我正在尝试制作密码加密的一部分。我正在尝试使用我获得的密钥流对数据进行加密。
数据格式为uint8_t,密钥流KS为uint32_t。
变量 n 是数据的长度(显然是 32 位块)
我有这个代码:
for (i=0; i<n; i++)
{
wo_data[4*i+0] ^= (uint8_t)(KS[i] >> 24) & 0xff;
wo_data[4*i+1] ^= (uint8_t)(KS[i] >> 16) & 0xff;
wo_data[4*i+2] ^= (uint8_t)(KS[i] >> 8) & 0xff;
wo_data[4*i+3] ^= (uint8_t)(KS[i] ) & 0xff;
}
但它甚至没有达到预期的效果。
现在,如果我将数据转换为 32 位长度:
uint32_t* data2 = (uint32_t *)wo_data;
for(i=0; i < n; i++)
{
data2[i] ^= KS[i];
}
它开始工作了。有人可以解释我为什么吗?我更喜欢使用 8 位长度,因为如果输入数据不是字节对齐的,则更容易对齐结尾。
数据初始化如下:
7EC61272 743BF161 4726446A 6C38CED1
66F6CA76 EB543004 4286346C EF130F92
KS 初始化如下:
F22DB45B 37E71C5B 4EB6F404 CD886C15
9DCA27B1 F062AF46 F8E2F587 8976E8B8
我期待以下(显然):
8CEBA629 43DCED3A 0990B06E A1B0A2C4
FB3CEDC7 1B369F42 BA64C1EB 6665E72A
【问题讨论】:
-
“但它甚至没有达到预期的效果。” 预期什么?会发生什么?
-
通过编辑帖子,您应该明确
KS和wo_data最初包含哪些数据,您得到什么结果以及您期望什么结果。 -
"数据采用 uint8_t 格式" ..."数据初始化如下:7EC61272 ..." 这有什么意义?您不能在
uint8_t中存储 32 位数字。 -
您确定字节序吗?此外,
& 0xff在 转换为uint8_t之后看起来是多余的。
标签: c char int bit-manipulation unsigned