代码之家  ›  专栏  ›  技术社区  ›  Syed Khizer Abass

Java DES错误加密

  •  0
  • Syed Khizer Abass  · 技术社区  · 8 年前

    我已经使用内置库在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
    纯文本:8787878787087878787
    加密:m^m'+m^m'+

    所需加密:0000000000000000

    这就是我所说的在线计算器中加密输出的答案是0000,我的答案完全不同:

    Image

    3 回复  |  直到 8 年前
        1
  •  1
  •   mazhar islam    8 年前

    改变

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

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

    此外,在代码中使用模式ECB(因为您在图片中标记了ECB)。比如:

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

    这个 String.getBytes() 使用平台的默认字符集将字符串编码为字节序列,并将结果存储到新的字节数组中。在本例中,它是一个长度为16的数组,包含值 56 55 56 55... ASCII 代表 8787...

    变为二进制。

        2
  •  1
  •   zaph    8 年前

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

        3
  •  0
  •   user207421    8 年前

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