我必须为学校项目提供一个Feistel密码。 为此,我从主键确定了一个二级密钥。 首先,我必须将主键旋转到4位的左侧,并在当前圈的作用下重复此步骤N次。 然后我必须取这个新密钥的最后32位。
我的代码是:
int *encrypt(int *left, int *right, long long p_key)
{
int i;
int temp;
i = -1;
while (++i < 8)
{
temp = *right ^ f(p_key, i);
if (i != 7)
{
*right = *left;
*left = temp;
}
else
*right = temp;
}
return (left);
}
和
long long f(long long key, char tour)
{
int i;
long long mask;
long long last32bitsvalue;
i = -1;
while (++i != tour)
{
key = key << 4;
}
mask = (1 << 32) - 1;
last32bitsvalue = key & mask;
return (last32bitsvalue);
}
此外,我必须取出每个字节的比特奇偶校验,但我不知道我怎么能这样做,有人能解释一下吗?
否则,您是否看到我可以犯的任何错误?
谢谢!
答案 0 :(得分:0)
您不是在旋转,只需将键移到左侧即可。这意味着前4个最重要的位已经消失。
你应该存储它们并向右移动。
int8_t offset = 8 * sizeof(key) - 4;
int64_t overflow = (key >> offset) & 0xf;
int64_t key = (key << 4) | overflow;
//if you use unsigned, you can shift directly
uint64_t key = (key << 4) | (key >> (8 * sizeof(key) - 4));
overflow =&gt; 0101 0001&gt;&gt; 4 =&gt; 0000 0101
key =&gt; 0001 0000 | 000 0101 =&gt; 0001 0101