理解GNU Crypto DES算法(Java)的部分内容

时间:2011-01-27 20:00:51

标签: java cryptography key bit-manipulation des

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

最初我只是想在某些点提取密钥的状态,即在PC-1,PC-2,子密钥等之后。但是,这个计划并不像56bit密钥那样好PC-1之后的预期,似乎是48位,通过pc1m变量(假设当从十进制转换为二进制时键的表示(pc1m的值)是合理的)。因此,我试图找出这段代码:

  

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

但是,我对按位操作的理解很复杂,虽然我对它的评估方式有一个模糊的理解,但我看不出它的整体逻辑及其工作原理(或者说,为什么它看起来并不实际工作 - 虽然算法确实通过官方测试向量成功加密和解密)。在PC-1之后,我在哪里可以获得56位排列?

我还不清楚代码在“//加密密钥优先”后的代码是什么,因为pc1m变量没有改变,而pcr似乎只是复制了该值。

在明亮的一面,很明显,“烹饪”键会为Feistel轮创建子键。

顺便说一句,我可以引用您可以参考的任何其他非版权的Java实现,但是,我非常希望使用此实现。

任何帮助都会非常多,非常感谢!感谢。

1 个答案:

答案 0 :(得分:0)

代码段实际上是从kb读取56位并将其重新排列为pc1m(假设pc1m的初始值为0)。

// 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));
    }
}

因此kb中描述的56位排列后PC1的值将在pc1m中作为单个长整数提供。