DES Decryption:给定最终块没有正确填充

时间:2014-01-04 12:43:57

标签: java encryption des

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

   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);

字节数组内容的长度始终是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();
    }
    }
}

1 个答案:

答案 0 :(得分:0)

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