Java DES错误加密

时间:2016-10-15 23:15:57

标签: java encryption des

我使用内置库在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,而我的完全不同:

Image

3 个答案:

答案 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位数字。