我使用内置库在Java中编码DES,但我没有得到正确的加密结果。请解释我在哪里犯了错误
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.xml.bind.DatatypeConverter;
public class MainClass {
public static void main(String[] args) {
String l = "0e329232ea6d0d73";
byte[] a = DatatypeConverter.parseHexBinary(l);
try{
DESKeySpec dks = new DESKeySpec(a);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(dks);
Cipher c = Cipher.getInstance("DES");
c.init(Cipher.ENCRYPT_MODE, sk);
String M = "8787878787878787";
byte[] b = c.doFinal(M.getBytes());
System.out.println(new String(b));
c.init(Cipher.DECRYPT_MODE, sk);
System.out.println(new String(c.doFinal(b)));
}
catch(Exception e)
{
System.out.println(e.getMessage());
}
}
}
HexaDecimal 16数字键:0e329232ea6d0d73
纯文本:8787878787878787
加密:-m ^MúÊ'+ - m ^MúÊ'+©ôËÓ-
所需加密:0000000000000000
这就是我所说的在线计算器加密输出中的答案是0000,而我的完全不同:
答案 0 :(得分:1)
数据为:hex 8787878787878787
,需要转换为二进制。
`
答案 1 :(得分:1)
更改
byte[] b = c.doFinal(M.getBytes());
到
byte[] b = c.doFinal(DatatypeConverter.parseHexBinary(M));
此外,在代码中使用模式ECB(因为您在图片中标记了ECB)。像:
Cipher c = Cipher.getInstance("DES/ECB/NoPadding");
String.getBytes()使用平台的默认字符集将String编码为字节序列,将结果存储到新的字节数组中。在您的情况下,这是一个长度为16的数组,其中包含值56 55 56 55...
ASCII 8787...
的表示
您需要将Hex 8787...
转换为二进制。
答案 2 :(得分:0)
该在线计算器的输入声明为十六进制,表示数据转换。你没有在代码中进行任何十六进制转换:你只是提供ASCII的10位数字。