gpt4 book ai didi

java - DES 蛮力(学术)

转载 作者:行者123 更新时间:2023-12-04 11:50:16 26 4
gpt4 key购买 nike

我正在上计算机安全类(class),我们的一项任务是对具有弱 key 的 DES 进行暴力破解。
我的代码:

    public static void main(String[] args) throws Exception {
String temp;
String current;
String plaintext;

//Generate key for DES
String initkey = "00000006";
byte[] Rawkey = initkey.getBytes();
DESKeySpec dks = new DESKeySpec(Rawkey);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey desKey = skf.generateSecret(dks);

//Text Enc & Dec
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");

//Declare wether to enc or dec
cipher.init(Cipher.ENCRYPT_MODE,desKey);
byte []message = "Decrypted Successfully".getBytes();
byte []messageEnc = cipher.doFinal(message);
plaintext = new String(message);
System.out.println("Cipher Text: " + new String(messageEnc) );

for(int i=0;i<10;i++){
try{
temp = padLeftZeros(Integer.toString(i),8);
System.out.println(temp);
byte []RawkeyTest = temp.getBytes();
DESKeySpec dksTest = new DESKeySpec(RawkeyTest);
SecretKeyFactory skf2 = SecretKeyFactory.getInstance("DES");
SecretKey desKeyTest = skf2.generateSecret(dksTest);
cipher.init(Cipher.DECRYPT_MODE,desKeyTest);
byte []dec = cipher.doFinal(messageEnc);
current = new String(dec);
if(current.equals(plaintext)){
System.out.println("Decrypted Text: " + current);
System.out.println("");
//break;
}

}catch (BadPaddingException ex){
System.out.println("Wrong Key.");
System.out.println("");
}

}

}

public static String padLeftZeros(String inputString, int length) {
if (inputString.length() >= length) {
return inputString;
}
StringBuilder sb = new StringBuilder();
while (sb.length() < length - inputString.length()) {
sb.append('0');
}
sb.append(inputString);

return sb.toString();
}
}
输出
Cipher Text: �
B��4#Ǡ�`=Π��H�č:�
00000000
Wrong Key.

00000001
Wrong Key.

00000002
Wrong Key.

00000003
Wrong Key.

00000004
Wrong Key.

00000005
Wrong Key.

00000006
Decrypted Text: Decrypted Successfully

00000007
Decrypted Text: Decrypted Successfully

00000008
Wrong Key.

00000009
Wrong Key.

00000010
Wrong Key.

00000011
Wrong Key.

00000012
Wrong Key.

00000013
Wrong Key.

00000014
Wrong Key.

00000015
Wrong Key.

00000016
Decrypted Text: Decrypted Successfully

00000017
Decrypted Text: Decrypted Successfully

00000018
Wrong Key.

00000019
Wrong Key.
key #6 是唯一应该成功解密的 key 。
所以我不明白为什么 key: 7, 16, 17 也有效。
任何帮助或建议将不胜感激。
提前致谢。

最佳答案

没有问题,实际上,有一个。
DES 通常使用 64 位 key ,其中每个字节的最后一位 (lsb) 是奇偶校验位,总共有 56 位加密 key 。奇偶校验位对 key 调度没有贡献。这就是我们说 DES 具有 56 位 key 大小的原因。一旦检查奇偶校验,它们就会被丢弃。 key 的每个字节必须具有奇校验。该库忽略了奇偶校验问题并且不提供异常。

  • 0x0...6 = 0x..01107=0x..0111 .如果您删除正确的位,它们是相同的。
  • 0x0..16 = 0x...0001 011017=0x...0001 0111 .现在删除每个字节中的最后一位,那么 key 将与 0x00000006 相同

  • 并请注意,上述 key 都不是奇偶校验有效的。如果您想检查奇偶校验或使您的 key 有效,您可以使用以下来自 Alejandro Revilla github 的 Java 代码
    public static void adjustDESParity (byte[] bytes) {
    for (int i = 0; i < bytes.length; i++) {
    int b = bytes[i];
    bytes[i] = (byte)((b & 0xfe) | ((((b >> 1) ^ (b >> 2) ^ (b >> 3) ^ (b >> 4) ^ (b >> 5) ^ (b >> 6) ^ (b >> 7)) ^ 0x01) & 0x01));
    }
    }

    public static boolean isDESParityAdjusted (byte[] bytes) {
    byte[] correct = (byte[])bytes.clone();
    adjustDESParity(correct);
    return Arrays.equals(bytes, correct);
    }

    如果您正在寻找 DES 的弱 key ,那么这些是
    0101 0101 0101 0101
    1F1F 1F1F 0E0E 0E0E
    E0E0 E0E0 F1F1 F1F1
    FEFE FEFE FEFE FEFE

    关于java - DES 蛮力(学术),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67349826/

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