【问题标题】:DES Decryption: Given final block not properly paddedDES解密:给定最终块未正确填充
【发布时间】:2014-01-22 03:45:14
【问题描述】:

我正在尝试为 FTP 客户端的“RETR”操作解密大于 1k 的文件的内容,我遇到了这种异常。

   javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:811)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:676)
at com.sun.crypto.provider.DESCipher.engineDoFinal(DESCipher.java:314)
at javax.crypto.Cipher.doFinal(Cipher.java:2145)

这是给我带来问题的代码:

    byte[] encontent = new byte[0];
    byte[] buff = new byte[1024];
    int k = -1;
    while((k = bis.read(buff, 0, buff.length)) > -1) {
    byte[] tbuff = new byte[encontent.length + k]; // temp buffer size = bytes already  read + bytes last read
    System.arraycopy(encontent, 0, tbuff, 0, encontent.length); // copy previous bytes
    System.arraycopy(buff, 0, tbuff, encontent.length, k);  // copy current lot
    encontent = tbuff; // call the temp buffer as your result buff
    }
     System.out.println(encontent.length + " bytes read.");
     byte [] plain = dcipher.doFinal(encontent, 0,encontent.length);

字节数组encontent的长度总是一个8位的倍数,因为它是之前加密的结果。

这是从服务器端启动操作的代码:

  public void download (String pathfile)
 {
       Socket DataSock = null;
    try {
            DataSock = new Socket (clientAddr, TRANSMISSION_PORT);
            if (DataSock.isConnected())
            {
                BufferedOutputStream bos = new BufferedOutputStream (DataSock.getOutputStream());
                int size=0;
                int blocks=0;
                int resto=0;
                if (pathfile.endsWith(".txt"))
                {
                    String text = readTxtFile (pathfile);
                    byte [] encontent = ecipher.doFinal(text.getBytes("UTF8"));
                    sendFile (bos,encontent);
                } else {
                    byte [] content = readFile (pathfile);
                    byte [] encontent = ecipher.doFinal(content);
                    sendFile (bos, content);
                }
            }

    } catch (Exception e)
    {
        e.printStackTrace();
    } finally {
        try {
        DataSock.close();
    } catch (Exception e)
    {
        e.printStackTrace();
    }
    }
}

【问题讨论】:

标签: java encryption des


【解决方案1】:

最后一个块必须包含 8 个字节。如果没有,则必须填充到 8 字节宽。你的假设是错误的。 看看https://stackoverflow.com/a/10427679/867816

【讨论】:

  • 文件的内容已经被填充,因为用于加密的 Cipher 是“DES/CBC/PKCS5Padding”..
  • 我已经编辑了帖子中的第一条消息。当我尝试发送大于 1k 的文件时出现此异常。我不知道出了什么问题,因为我重复相同的代码也将这种文件从客户端发送到服务器并且它工作正常......
猜你喜欢
  • 1970-01-01
  • 2013-12-02
  • 2015-05-22
  • 2015-03-28
  • 1970-01-01
  • 2015-03-31
  • 2018-08-17
  • 2015-10-07
  • 1970-01-01
相关资源
最近更新 更多