c - C 中的位运算/操作 - 解密

标签 c encryption bit-manipulation

我正在用购买的一些教科书自学 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);

最佳答案

让我们逐行分解:

        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 的字节实际上被或运算在一起形成 32 位长。由于缺乏上下文,很难准确地说出这应该实现什么。我想它可能会将 key 的各个位混合在一起以形成“圆形 key ”或类似的东西。

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 | itkey[28](大端格式)。

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

关于c - C 中的位运算/操作 - 解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38175075/

相关文章:

java - Spring Cloud Config Encryption API 忽略最后的特殊字符

c - K&R C 反转功能

c - select 中使用的 fd_set 如何检查位掩码?

c - 使用 GCC 链接器强制执行 32 位枚举

c - 关于结构的边界问题

在控制台中看不到 Windows 程序的标准输出(在 Windows 上用 Clang 编译)

python - 解析 proto 文件并生成纯 C 结构的脚本

c# - 使用 AES/Rijndael 在 PHP 中加密,在 C# (WP7/Silverlight) 中解密

javascript - 信用卡支付可以用JS加密代替SSL吗?

c# - 在 C# 中将 int 转换为 4 字节的最快方法