解密des算法方法坏填充

时间:2017-04-04 17:14:13

标签: java encryption

我尝试使用des算法进行加密和解密。对于enryption我没有问题,并成功地将明文转换为字节数组。但是我无法将密文解密为普通明文。我认为我的解密方法有一些问题。这是我的编码

import java.io.ByteArrayInputStream;    
import java.io.ByteArrayOutputStream;    
import javax.crypto.Cipher;    
import javax.crypto.CipherInputStream;    
import javax.crypto.CipherOutputStream;    
import javax.crypto.spec.IvParameterSpec;    
import javax.crypto.spec.SecretKeySpec;    
import javax.xml.bind.DatatypeConverter;

public class FileEncryption {

    //Initial Vector
    public static final byte[] iv = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };      

    //EncryptAndDecrypt String -> Input : PlainText + Return : CipherText+DecipherText
    public static String encryptString(String src) throws Exception
    {
        String dst="";
        //Not Input!
        if(src == null || src.length()==0)
            return "";

        //Encryption Setting
        byte[] k="Multimediaproces".getBytes();
        SecretKeySpec Key = new SecretKeySpec(k,"AES");
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        encryptCipher.init(Cipher.ENCRYPT_MODE,Key,ivspec);

        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        CipherOutputStream cout = new CipherOutputStream(baos,encryptCipher);
        cout.write(src.getBytes());
        cout.flush();               //ByteOutputStream -> Write Encryption Text
        cout.close();           
        dst = DatatypeConverter.printHexBinary(baos.toByteArray());
        return dst;
    }   
    //String src -> EncryptedData
    public static String decryptString(String src) throws Exception 
    {
        //src value is Encrypted Value!
        //So, src value -> Not Byte!
        //String dst="";
        byte[] encryptedBytes = src.getBytes();         
        //Not Input!
        if(src == null || src.length()==0)
            return "";          
        //Decryption Setting
        IvParameterSpec ivspec = new IvParameterSpec(iv);
        byte[] k="Multimediaproces".getBytes();
        SecretKeySpec Key = new SecretKeySpec(k,"AES");
        Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        decryptCipher.init(Cipher.DECRYPT_MODE,Key,ivspec); 

        //ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ByteArrayInputStream bais = new ByteArrayInputStream(encryptedBytes);
        CipherInputStream cin = new CipherInputStream(bais,decryptCipher);
        //CipherOutputStream cout = new CipherOutputStream(baos,decryptCipher);
        //cout.write(src.getBytes());
        byte[] buf = new byte[1024];
        int read;
        while((read=cin.read(buf))>=0)  //reading encrypted data!
        {
            cin.read(buf,0,read);     //writing decrypted data!
            //read = cin.read(buf);
        }
        // closing streams
        //baos.write(decryptCipher.doFinal());
        //return baos.toString();
        //cin.close(); 
        return bais.toString();
    }
}

运行代码时出现的错误 error messages

1 个答案:

答案 0 :(得分:1)

encryptString方法中,您将字节转换为十六进制字符串:

dst = DatatypeConverter.printHexBinary(baos.toByteArray());

因此,为了解密,您必须将此十六进制字符串转换回字节:

// Instead of this: byte[] encryptedBytes = src.getBytes();
// Do this:
byte[] encryptedBytes = DatatypeConverter.parseHexBinary(src);

您正在返回toString()的{​​{1}}表示,但您实际需要的是ByteArrayInputStream变量(因为它将包含解密数据)。 因此,您的buf方法应返回:

decryptString

注意:当您将// Instead of this: return bais.toString(); // do this: return new String(buf); 转换为字节,将字节转换回String时,您可能会面临一些编码问题。为防止这种情况,建议始终使用相同的编码进行两次转换。在这种情况下,您可以执行以下操作(假设您要使用 UTF-8 )。

String

encryptString

cout.write(src.getBytes("UTF-8")); // instead of cout.write(src.getBytes());

decryptString

这适用于任何编码,只要您对两种方法都使用相同