0

我有一个问题,我在过去三天一直试图解决。我必须使用 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 方法只是将字节转换为十六进制,反之亦然。有人可以帮我吗?找了好久,就是不知道怎么办。提前致谢。乔

4

1 回答 1

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);
    }
}
于 2012-11-01T10:57:22.217 回答