我目前对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实现,但是,我非常希望使用此实现。
任何帮助都会非常多,非常感谢!感谢。
答案 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
中作为单个长整数提供。