我有一个问题,我过去三天一直试图解决。我必须使用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,反之亦然。 有人可以帮帮我吗?在寻找了相当长的一段时间后,我只是不知道该怎么做。提前致谢。乔
答案 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);
}
}