Question

I'm trying to encrypt and decrypt a string using TrippleDES algorythm and without using Base64 encoding (my app will be talking to another app that has these requirements). Everything worked beautifully when I was testing stuff using Base64 encoding/decoding, but when I switched to doing it plain-text style (like the app I'm calling requires), everything broke.

I've read this post Given final block not properly padded which says the key is wrong on decoding, but that can't be, because these lines actually pass in the same variables for both the key and transformation:

ecipher = Cipher.getInstance(transformation);
dcipher = Cipher.getInstance(transformation);
ecipher.init(Cipher.ENCRYPT_MODE, key, iv);
dcipher.init(Cipher.DECRYPT_MODE, key, iv);

Also, I've printed out the lengths of both the encoded string and the array, their lengths are multiples of 8.

My output with I'm getting:

originalText: Abcdefgh
number of bites: 16
cryptText: d4167d9e2b3b1b2d1f940bc45099da0a
cryptText.length: 32
cryptText.getBytes().length: 32
Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.SunJCE_f.b(DashoA13*..)
    at com.sun.crypto.provider.DESedeCipher.engineDoFinal(DashoA13*..)
    at javax.crypto.Cipher.doFinal(DashoA13*..)
Java Result: 1

My full code (slightly modified version of this tutorial http://eternusuk.blogspot.com/2008/09/java-triple-des-example.html):

package com.test.encrypt;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;
import org.apache.commons.codec.binary.Hex;

public class TrippleDESTest
{
    private Cipher ecipher;
    private Cipher dcipher;
    private String algorithm = "DESede";
    private String transformation = "DESede/CBC/PKCS5Padding";
    private String keyPhrase = "123456789012345678901234"; //your keyphrase 24 bit
    private SecretKey key;
    private IvParameterSpec iv;
    private static TrippleDESTest cryptoUtil;
    private String ENCODING = "UTF-8";

    public static TrippleDESTest getInstance() throws Exception
    {
        if (cryptoUtil == null)
        {
            cryptoUtil = new TrippleDESTest();
        }

        return cryptoUtil;
    }

    private TrippleDESTest() throws Exception
    {
            DESedeKeySpec keySpec = new DESedeKeySpec(keyPhrase.getBytes());
            key = SecretKeyFactory.getInstance(algorithm).generateSecret(keySpec);
            iv = new IvParameterSpec(new byte[8]);
            ecipher = Cipher.getInstance(transformation);
            dcipher = Cipher.getInstance(transformation);
            ecipher.init(Cipher.ENCRYPT_MODE, key, iv);
            dcipher.init(Cipher.DECRYPT_MODE, key, iv);
    }

    public String encrypt(String str) throws Exception
    {
            byte[] utf8 = str.getBytes(ENCODING);    
            byte[] enc = ecipher.doFinal(utf8);                
            System.out.println("number of bites: " + enc.length);    
            return Hex.encodeHexString(enc);
    }

    public String decrypt(String str) throws Exception
    {
            byte[] dec = str.getBytes();
            byte[] utf8 = dcipher.doFinal(dec);    
            return Hex.encodeHexString(utf8);
    }

    public static void main(String[] args) throws Exception
    {
        TrippleDESTest test = TrippleDESTest.getInstance();        
        String originalText = "Abcdefgh";        
        System.out.println("originalText: " + originalText);        
        String cryptText = test.encrypt(originalText);        
        System.out.println("cryptText: " + cryptText);        
        System.out.println("cryptText.length: " + cryptText.length());
        System.out.println("cryptText.getBytes().length: " + cryptText.getBytes().length);        
        System.out.println("decote text: " + test.decrypt(cryptText));

    }
}// end class TrippleDESTest

Thanks in advance!

Was it helpful?

Solution

You are performing the hexadecimal encoding in the wrong order. You need to decode the ciphertext, instead of encoding the plain text in your decrypt method.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top