【问题标题】:bit operations/manipulation in c - decryptionc中的位操作/操作 - 解密
【发布时间】:2016-07-04 07:47:22
【问题描述】:

我正在用我购买的一些教科书自学 c。一般来说,这很容易,但我不太容易掌握的一个领域与位操作有关。我理解运算符在字面(孤立)意义上的使用,但不太了解它们在下面的特定上下文中如何应用。

下面有 2 个这样的示例,我无法理解它们在某些解密算法的上下文中是如何/做什么的。

我正在寻找的只是对十六进制和位移/左右将一起做什么的解释。

我在网上浏览的大多数示例都是孤立的,到目前为止还没有深入了解它们是如何在这种情况下应用的。

如果有任何人都可以推荐的特定于位操作/操作的教科书,我也愿意投资于此类信息。这就是我真正确定这一点的决心(我讨厌在没有完全掌握的情况下继续前进)。

            unsigned long lBits = 0;
            lBits = ((unsigned long)(key[28] & 0xFFFF)<< 24)|
            ((unsigned long)(key[29] & 0xFFFF)<< 16)|
            ((unsigned long)(key[30] & 0xFFFF)<< 8)|
            ((unsigned long)(key[31] & 0xFFFF));

  ...

  for(i=0; i < max_length ; i++){
     unsigned long tBits = lBits | i;    
     tkey[28] = (unsigned char) (tBits >> 24);
     tkey[29] = (unsigned char) (tBits >> 16);
     tkey[30] = (unsigned char) (tBits >> 8);
     tkey[31] = (unsigned char) (tBits);

【问题讨论】:

  • 你没有提供keytkey的声明。
  • 是的,我希望减少我发布的代码量,因为示例很长。 key 是通过命令行传入的 char 数组 arg,它是 32 位密钥的一部分,tkey 是相同的密钥,用 0 填充以满足 32 位长度。
  • 它是unsigned char 数组,还是只是char
  • 无符号字符密钥,tkey;

标签: c encryption bit-manipulation


【解决方案1】:

让我们逐行分解:

        unsigned long lBits = 0;
        lBits = ((unsigned long)(key[28] & 0xFFFF)<< 24)|
        ((unsigned long)(key[29] & 0xFFFF)<< 16)|
        ((unsigned long)(key[30] & 0xFFFF)<< 8)|
        ((unsigned long)(key[31] & 0xFFFF));

起初这很令人困惑。乍一看,这似乎试图读取从 key[28] 开始的大端 32 位整数。但是,由于掩码是 0xFFFF(16 位),而不是典型 8 位掩码的预期 0xFF,这不是实际效果。实际发生的情况是 key 的字节实际上被 OR'd 在一起成为一个 32 位长。鉴于缺乏上下文,很难准确地说出这应该达到什么目的。我想它可能会将密钥的位混合在一起以形成“圆形密钥”等。

for(i=0; i < max_length ; i++){
   unsigned long tBits = lBits | i;    
   tkey[28] = (unsigned char) (tBits >> 24);
   tkey[29] = (unsigned char) (tBits >> 16);
   tkey[30] = (unsigned char) (tBits >> 8);
   tkey[31] = (unsigned char) (tBits);

这有点清楚了。它只是以大端格式将tBits | i 写入tkey[28]

实际上,这是循环i 中的所有位组合并将它们写入从key[28] 开始的32 位。我认为循环体的其余部分对这些位做了一些事情。

【讨论】:

  • 感谢您的输入。计数器迭代可能的组合数量以填充提供的部分键。不过,我真的不明白这如何适用于上述情况。
  • 啊。对不起。刚刚意识到计数器应该是我。我复制不正确。 :(
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多