【发布时间】:2018-11-19 00:30:56
【问题描述】:
我正在使用 DES 进行加密,它使用 56 位有效密钥(在丢弃最低有效位之后)加密 64 位明文。我想将密钥的前 20 位设置为随机位,将后 36 位设置为 0。我一直在尝试使用 BitSet 来执行此操作,其中我设置了一个 64 位的数组,其中所有这些值在开始时是错误的。然后我设置了一个 20 位的临时数组,我一直在尝试在 for 循环中使用 bitset.set(Random.nextInt(n), true),它从 0 到 20 - 我的想法是我得到正好 20 个随机位。
为了丢弃最低有效位,我有一个从 0 到 20 的 for 循环。在这个 for 循环中,我有一个 if 语句,它丢弃前 20 个元素的每 8 个元素
static BitSet key1 = new BitSet(64);
static BitSet key2 = new BitSet(64);
public static void generate() {
BitSet temp1 = new BitSet(20);
BitSet temp2 = new BitSet(20);
Random r = new Random();
for (int i = 0; i < 20; i++) {
temp1.set(r.nextInt(60), true);
temp2.set(r.nextInt(60), true);
}
for (int i = 0; i < 20; i++) {
key1.set(i, temp1.get(i));
key2.set(i, temp2.get(i));
}
System.out.println(k1temp);
for (int i = 0; i < temp1.length(); i++) {
if (i % 8 == 0) {
key1.clear(i);
key2.clear(i);
}
}
}
所以,我遇到的问题是我的BitSet 并不总是包含 20 个元素,这导致我生成的密钥是错误的。我已经通过代码多次,但我看不出有什么问题。
编辑:
我所说的第一个和最后一个是指第一位是最高有效位,最后一位是最低有效位。
【问题讨论】:
-
@Kartik,这是一个错字:) 编辑了 sn-p
-
我不明白你想在这里做什么。假设你真的想要 20 位,并且假设前 36 个低位应该为零,为什么不随机生成一个 20 位数字(这可以通过
Random()的范围参数轻松完成Java 中的方法,只需传递 2^20),然后左移 36 位?这应该需要大约 3 行代码来实现。 -
@RobertHarvey:丢弃最低有效位后,我希望最后 36 位为零,所以我有一个 56 位密钥,其中前 20 位是随机生成的,最后 36 位是是零
-
@Bab 编辑您的问题以解释这一点。
-
请清楚您所说的“第一”和“最后”是什么意思。使用术语“最重要”和“最不重要”,而不是“第一个和最后一个”(我们不知道您从单词的哪个结尾开始计算位)。