Java DES加密错误

Java DES Wrong Encryption

我使用内置库在 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());
        }   
    }

}

十六进制 16 位密钥:0e329232ea6d0d73
纯文本:8787878787878787
加密:–m^MúÊ'+–m^MúÊ'+©ôÈÓ—

所需加密:0000000000000000

这就是我说的在线计算器加密输出的答案是0000,和我的完全不一样:

数据为:十六进制8787878787878787需要转为二进制。 `

那个在线计算器的输入是十六进制的,这意味着数据转换。您没有在代码中进行任何十六进制转换:您只是在 ASCII 中提供以 10 为底的数字。

改变

byte[] b = c.doFinal(M.getBytes());

byte[] b = c.doFinal(DatatypeConverter.parseHexBinary(M));

此外,在你的代码中使用 ECB 模式(因为你在图片中标记了 ECB)。喜欢:

Cipher c = Cipher.getInstance("DES/ECB/NoPadding");

String.getBytes() encodes the String into a sequence of bytes using the platform's default charset, storing the result into a new byte array. In your case which is an array of length 16 containing values 56 55 56 55... ASCII表示8787...

您需要将十六进制 8787... 转换为二进制。