Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java AES CBC Decryption

PHP Encrypt Function

$privateKey = "1234567812345678";
$iv = "1234567812345678";
$data = "Test string";

$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $privateKey, $data, MCRYPT_MODE_CBC, $iv);

echo(base64_encode($encrypted));

Result: iz1qFlQJfs6Ycp+gcc2z4w==

When I try to decrypt this result in Java using the function below, all I get back is ì�š@ÔBKxnfÈ~¯Ô'M while I am expecting "Test string". Any ideas where I am wrong? Thanks

public static String decrypt() throws Exception{
    try{
        String Base64EncodedText = "iz1qFlQJfs6Ycp+gcc2z4w==";
        String decodedText = com.sun.xml.internal.messaging.saaj.util.Base64.base64Decode(Base64EncodedText);
        String key = "1234567812345678";
        String iv = "1234567812345678";

        javax.crypto.spec.SecretKeySpec keyspec = new javax.crypto.spec.SecretKeySpec(key.getBytes(), "AES");
        javax.crypto.spec.IvParameterSpec ivspec = new javax.crypto.spec.IvParameterSpec(iv.getBytes());

        javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance("AES/CBC/NoPadding");
        cipher.init(javax.crypto.Cipher.DECRYPT_MODE, keyspec, ivspec);
        byte[] decrypted = cipher.doFinal(decodedText.getBytes());

        String str = new String(decrypted);

        return str;

    }catch(Exception e){
        return null;
    }   
}
like image 512
user812120 Avatar asked May 31 '12 22:05

user812120


People also ask

How does AES CBC decryption work?

AES in CBC mode splits the stream into 16-byte blocks. Each block is encrypted using AES and the result is sent to output and XORed with the following block before it gets encrypted.

Does Java support AES 256?

AES 256 Encryption and Decryption Encrypting or decrypting a message or a string is supported by Java Cryptographic Extension (JCE) framework in Java. The Java Cryptographic Extension framework provides different packages for encryption and decryption.

What is CBC in Java?

AES Encryption in Java Here, we are using AES with CBC mode to encrypt a message as ECB mode is not semantically secure. The IV mode should also be randomized for CBC mode. If the same key is used to encrypt all the plain text and if an attacker finds this key then all the cipher can be decrypted in the similar way.


1 Answers

EDIT: As of Java 8 Java now includes an acceptable Base64 class, java.util.Base64.


This line

String decodedText = com.sun.xml.internal.messaging.saaj.util.Base64.base64Decode(Base64EncodedText);

looks wrong. Instead, use the apache commons codec classes or the Harder base64 class. Also the default padding used by mcrypt, zero padding, is arguably wrong and makes it difficult to use the results in other languages. The users comments section for the mcrypt_encrypt web pages has examples of how to do this.

Here is small example that uses the apache commons classes to decrypt your string.

import java.nio.charset.Charset;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.Hex;

public class AESToy3 {

    private static final Charset ASCII = Charset.forName("US-ASCII");

    public static void main(String[] args) throws Exception {
        String base64Cipher = "iz1qFlQJfs6Ycp+gcc2z4w==";
        byte [] cipherBytes = Base64.decodeBase64(base64Cipher);
        byte [] iv = "1234567812345678".getBytes(ASCII);
        byte [] keyBytes = "1234567812345678".getBytes(ASCII);

        SecretKey aesKey = new SecretKeySpec(keyBytes, "AES");

        Cipher cipher = Cipher.getInstance("AES/CBC/NOPADDING");
        cipher.init(Cipher.DECRYPT_MODE, aesKey, new IvParameterSpec(iv));

        byte[] result = cipher.doFinal(cipherBytes);
        System.out.println(Hex.encodeHexString(result));
    }

}

this produces the following output:

5465737420737472696e670000000000

which when decoded as ASCII and removing the trailing zeros gives you Test string

like image 192
President James K. Polk Avatar answered Sep 17 '22 17:09

President James K. Polk