gpt4 book ai didi

java - 了解 GNU Crypto DES 算法的部分内容 (Java)

转载 作者:行者123 更新时间:2023-12-01 05:50:33 25 4
gpt4 key购买 nike

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

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

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

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

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

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

顺便说一句,我会对您可以引用的任何其他无版权 Java 实现感兴趣,但是,我非常愿意使用此实现。

任何帮助将非常非常感谢!谢谢。

最佳答案

该代码片段确实从 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));
}
}

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

关于java - 了解 GNU Crypto DES 算法的部分内容 (Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4821197/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com