2012-11-01 28 views
0

我有一个问题,我一直试图解决过去三天。我必须使用DES来加密字节数组以获得特定结果。但是,Java中的DES的默认实现(Javax.crypto.cipher,JDK 7,提供者SunJCE版本1.7)似乎不起作用。 当我有以下代码:Java密码DES怪异结果

 

    private void testDES() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { 
     Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); 
     byte[] keyByte = convertStringToBytes("00 00 00 00 00 00 00 00"); 
     byte[] data = convertStringToBytes("00 00 00 00 00 00 00 00"); 
     Key key = new SecretKeySpec(keyByte, "DES"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     System.out.println(hexadecimalString(cipher.doFinal(data))); 
    } 
 

它打印F4 DA 4D 97 BF CF 23 D9而不是正确结果的图8C A6 4D E9 C1 B1 23 A7(根据测试向量:http://common-lisp.net/project/clbuild/mirror/ironclad/test-vectors/des.testvec) 的方法hexadecimalString和convertStringToBytes只是将字节转换为hexa,反之亦然。 任何人都可以帮我吗?经过了相当长的时间,我只是不知道该怎么做。提前致谢。乔

+0

也许这些方法只是做了错误的?为什么不直接使用字节:'new byte [] {0,0,0,0,0,0,0,0}'? –

回答

1

我认为问题是与convertStringToBytes或十六进制字符串。

您可以更换:

byte[] keyByte = convertStringToBytes("00 00 00 00 00 00 00 00"); 
byte[] data = convertStringToBytes("00 00 00 00 00 00 00 00"); 

有:

byte[] keyByte = new byte[8]; 
byte[] data = new byte[8]; 

...因为在Java中,数组初始化为零。

当我运行相同的代码,但与上述(而不是convertStringToBytes),然后我得到预期的结果(8C A6 ...)

编辑: 既然你仍然有问题,这是一个完整的程序。对我来说,输出:

8c a6 4d e9 c1 b1 23 a7 

代码如下:

public class Main { 
    public static void main(String[] args) throws GeneralSecurityException { 
     Cipher cipher = Cipher.getInstance("DES/ECB/NoPadding"); 
     byte[] keyByte = new byte[8]; 
     byte[] data = new byte[8]; 
     Key key = new SecretKeySpec(keyByte, "DES"); 
     cipher.init(Cipher.ENCRYPT_MODE, key); 
     byte[] result = cipher.doFinal(data); 
     StringBuilder str = new StringBuilder(); 
     for (byte b : result) { 
      str.append(Integer.toHexString(0xff & b)).append(' '); 
     } 
     System.out.println(str); 
    } 
} 
+0

嗨,感谢您的回复,但不幸的是,它不起作用 - 即使用net byte [8]替换上述变量后,它仍然返回相同的结果:( 这可能意味着我的系统中存在某种错误? – Falkenstein

+0

也许你的'hexadecimalString()'方法也是错误的。 –

+0

这样做!非常感谢,回答标记为正确:) – Falkenstein