Java Cipher DES奇怪的结果

时间:2012-11-01 10:28:21

标签: java encryption des

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


    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,反之亦然。 有人可以帮帮我吗?在寻找了相当长的一段时间后,我只是不知道该怎么做。提前致谢。乔

1 个答案:

答案 0 :(得分:1)

我认为问题出在convertStringToBytes或hexadecimalString上。

您可以替换:

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);
    }
}