我目前对 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 实现都会引起我的兴趣,但是,我非常想使用这个实现。
任何帮助将不胜感激!谢谢。