我需要旋转64位密钥

时间:2015-03-01 12:03:19

标签: c

我必须为学校项目提供一个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);
}

此外,我必须取出每个字节的比特奇偶校验,但我不知道我怎么能这样做,有人能解释一下吗?

否则,您是否看到我可以犯的任何错误?

谢谢!

1 个答案:

答案 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