1

我目前对 GNU Crypto 包提供的 DES 算法的行为感到困惑。这是相关算法的链接:GNU Crypto DES algorithm

最初我只是想在某些点提取密钥的状态,即在 PC-1、PC-2、子密钥等之后。但是,这个计划并不像 PC 之后预期的 56 位密钥那样顺利-1,似乎是 48 位,由 pc1m 变量决定(假设从十进制转换为二进制时密钥(pc1m 的值)的表示是正确的)。因此,我试图弄清楚这段代码:

对于 (i = 0; i < 56; i++) { l = PC1[i]; pc1m |= ((kb[l >>> 3] & (0x80 >>> (l & 7))) != 0) ? (1L << (55 - i)) : 0; }

但是,我对按位运算的理解很模糊,虽然我对它的评估方式有一个模糊的理解,但我看不到它的整体逻辑以及它是如何工作的(或者,更确切地说,为什么它看起来实际上不起作用——尽管该算法确实通过官方测试向量成功加密和解密)。PC-1 之后在哪里可以获得 56 位排列?

我也不清楚代码在“ // Encryption key first. ”之后做了什么,因为 pc1m 变量没有改变,而且 pcr 似乎只是复制了这个值。

从好的方面来看,很明显,“烹饪”键会为 Feistel 回合创建子键。

顺便说一句,您可以参考的任何其他不受版权保护的 Java 实现都会引起我的兴趣,但是,我非常想使用这个实现。

任何帮助将不胜感激!谢谢。

4

1 回答 1

0

代码片段确实是从 56 位中读取kb并重新排列它们pc1m(假设 的初始值为pc1m0)。

// For each of the 56 bits
for (i = 0; i < 56; i++)
{
    L = PC1[i];                 // Get i-th bit index
    L_byte = L >>> 3;           // Get the byte where that bit is stored
    L_mask = 0x80 >>> (L & 7);  // Get the bit mask
    if (kb[L_byte] & L_mask] != 0)
    {
        // The PC1[i]-th bit of kb is set
        // so set bit at position 55-i (i=0 => MSB) in pc1m
        pc1m |= (1L << (55-i));
    }
}

因此kb56 位排列后的值PC1pc1m作为单个长整数提供。

于 2011-01-27T20:16:50.713 回答