c - C 函数 bit_get 在 DES 加密中起什么作用?

标签 c function encryption

我在阅读有关 DES 加密的内容时偶然发现了这段代码。我想知道它到底有什么作用?

我看到它根据最后一个 if 的结果返回 1 或 0。我还知道 mask 是十六进制的,十进制等于 128 (为什么是这个特定值?)。 for循环从0开始一直到pos%8,为什么呢? (我知道,例如如果 pos=14 那么 14%8=6)。

int bit_get(const unsigned char *bits, int pos)
{
 unsigned char mask;
 int i;
 mask = 0x80;

 for (i = 0; i < (pos % 8); i++)
 mask = mask >> 1;
 return (((mask & bits[(int)(pos / 8)]) == mask) ? 1 : 0);
}

谢谢!祝你有美好的一天:)

最佳答案

它从 8 位字符数组 pos 中获取第 bits 位(最高有效位 = 0)。

unsigned char 通常是 8 位长。因此,

bits[(int)(pos / 8)]

将首先提取所需位所在的八位字节。( pos = 8 × pos/8 + pos%8 )

然后我们从八位字节中获取实际位:

  10111010
# 01234567

为了提取一点,我们使用“掩码”执行&& 操作按位执行,如果两个操作数中的同一位都存在 1,则返回 1,否则返回 0,例如

  10111010
& 11010001
= 10010000

因此,为了提取第 0 位,我们将 & 设为 10000000 = 0x80,将第 1 位设为 01000000 = 0x40,等等。循环是为了获取正确的掩码。

& 只给出 0x80、0x40 等或 0,而不是 1 或 0。最终条件

(mask & bits[...]) == mask) ? 1 : 0

执行将非零掩码转换为 1、将 0 转换为 0 的作业。


顺便说一句,通常我们会使用位移运算符 &>> 来计算掩码。对于了解位运算的任何人来说,它都更高效、更清晰。

int bit_get(const uint8_t* bits, int pos) {
    uint8_t mask = 1 << (7 - pos % 8);
    return (bits[pos/8] & mask) ? 1 : 0;
}

关于c - C 函数 bit_get 在 DES 加密中起什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3935928/

相关文章:

c - 如何打印在 C 函数 main 中初始化的二维数组?

代码不会在 C 中的 do while 循环中执行

security - Delphi:安全/加密从互联网下载更新

C 结构返回指针,存储在引用中

c - 时间测量因微 Controller 而异

c - EASY C++(函数调用)

delphi - 数组作为结果类型和函数输入

r - 计算 x^2*y, 5*x+sin(y) 的雅可比矩阵

c++ - 将字符串拆分为字符,然后返回字符串

node.js - 使用 vb.net AES/CBC 加密字符串并需要使用 JavaScript CryptoJS 解密