noobie
noobie

Reputation: 3

Decryption des algorithm method bad padding

I tried to do encrypt and decrypt using des algorithm. For enryption i have no problems and successfully convert the plaintext to byte array. However i unable to decrypt the cipher text to normal plaintext. I think my decryption method have some problems. Here my coding

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

The error stated when i run the code error messages

Upvotes: 0

Views: 372

Answers (1)

user7605325
user7605325

Reputation:

In your encryptString method, you're transforming the bytes to a Hex string:

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

So, in order to decrypt, you must convert this Hex string back to bytes:

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

And you're returning the toString() representation of the ByteArrayInputStream, but what you actually need is the buf variable (as it'll contain the decrypted data). So your decryptString method should return:

// Instead of this: return bais.toString();
// do this:
return new String(buf);

Note: as you're converting String to bytes, and bytes back to String, you might face some encoding issues. To prevent that, it's recommended to always work with the same encoding for both conversions. In this case, you could do the following (assuming you want to use UTF-8, for example).

In encryptString:

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

In decryptString:

return new String(buf, "UTF-8"); // instead of return new String(buf);

This should work with any encoding, as long as you use the same for both methods.

Upvotes: 1

Related Questions