I have the following Java code
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
public class AESEncryption
{
public static final String AES_TRANSFORMATION = "AES/ECB/PKCS5Padding";
public static final String AES_ALGORITHM = "AES";
public static final int ENC_BITS = 256;
public static final String CHARACTER_ENCODING = "UTF-8";
private static Cipher ENCRYPT_CIPHER;
private static Cipher DECRYPT_CIPHER;
private static KeyGenerator KEYGEN;
static
{
try
{
ENCRYPT_CIPHER = Cipher.getInstance(AES_TRANSFORMATION);
DECRYPT_CIPHER = Cipher.getInstance(AES_TRANSFORMATION);
KEYGEN = KeyGenerator.getInstance(AES_ALGORITHM);
KEYGEN.init(ENC_BITS);
}
catch(NoSuchAlgorithmException | NoSuchPaddingException e)
{
e.printStackTrace();
}
}
/**
* This method is used to encode bytes[] to base64 string.
*
* @param bytes
* : Bytes to encode
* @return : Encoded Base64 String
*/
private static String encodeBase64String(byte[] bytes)
{
return new String(java.util.Base64.getEncoder().encode(bytes));
}
/**
* This method is used to decode the base64 encoded string to byte[]
*
* @param stringData
* : String to decode
* @return : decoded String
* @throws UnsupportedEncodingException
*/
private static byte[] decodeBase64StringTOByte(String stringData) throws Exception
{
return java.util.Base64.getDecoder().decode(stringData.getBytes(CHARACTER_ENCODING));
}
/**
* This method is used to encrypt the string which is passed to it as byte[] and return base64 encoded
* encrypted String
* @param plainText
* : byte[]
* @param secret
* : Key using for encrypt
* @return : base64 encoded of encrypted string.
*
*/
private static String encryptEK(byte[] plainText, byte[] secret)
{
try
{
SecretKeySpec sk = new SecretKeySpec(secret, AES_ALGORITHM);
ENCRYPT_CIPHER.init(Cipher.ENCRYPT_MODE, sk);
return Base64.encodeBase64String(ENCRYPT_CIPHER.doFinal(plainText));
}
catch(Exception e)
{
e.printStackTrace();
return "";
}
}
/**
* This method is used to decrypt base64 encoded string using an AES 256 bit key.
*
* @param plainText
* : plain text to decrypt
* @param secret
* : key to decrypt
* @return : Decrypted String
* @throws IOException
* @throws InvalidKeyException
* @throws BadPaddingException
* @throws IllegalBlockSizeException
*/
public static byte[] decrypt(String plainText, byte[] secret)
throws InvalidKeyException, IOException, IllegalBlockSizeException,
BadPaddingException,Exception
{
SecretKeySpec sk = new SecretKeySpec(secret, AES_ALGORITHM);
DECRYPT_CIPHER.init(Cipher.DECRYPT_MODE, sk);
return DECRYPT_CIPHER.doFinal(Base64.decodeBase64(plainText));
}
public static void main(String args[])throws Exception
{
String encKey = "";
//client asp_secret
String asp_secret="";
byte[] enc_key = decrypt(encKey, asp_secret.getBytes());
String enc_asp_secret=encryptEK(asp_secret.getBytes(), decodeBase64StringTOByte(encodeBase64String(enc_key)));
System.out.println("asp secret encrypted:");
System.out.println(enc_asp_secret);
}
}
I happened to see a very similar post in StackOverflow with no answers
Cannot replicate an AES 256 encryption code from Java to PHP [duplicate]
which is marked duplicate to another question which is different.
I have tried a couple of PHP codes but it didn't work out.
I will add up bounty for this as im trying this for ages.
Disclaimer : Used the same code snippet from the above question as this one is more clear.
Adding the PHP code I tried
class AtomAES {
public function encrypt($data = '', $key = NULL, $salt = "") {
if($key != NULL && $data != "" && $salt != ""){
$method = "AES-256-CBC";
//Converting Array to bytes
$iv = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
$chars = array_map("chr", $iv);
$IVbytes = join($chars);
$salt1 = mb_convert_encoding($salt, "UTF-8"); //Encoding to UTF-8
$key1 = mb_convert_encoding($key, "UTF-8"); //Encoding to UTF-8
//SecretKeyFactory Instance of PBKDF2WithHmacSHA1 Java Equivalent
$hash = openssl_pbkdf2($key1,$salt1,'256','65536', 'sha1');
$encrypted = openssl_encrypt($data, $method, $hash, OPENSSL_RAW_DATA, $IVbytes);
return bin2hex($encrypted);
}else{
return "String to encrypt, Salt and Key is required.";
}
}
public function decrypt($data="", $key = NULL, $salt = "") {
if($key != NULL && $data != "" && $salt != ""){
$dataEncypted = hex2bin($data);
$method = "AES-256-CBC";
//Converting Array to bytes
$iv = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
$chars = array_map("chr", $iv);
$IVbytes = join($chars);
$salt1 = mb_convert_encoding($salt, "UTF-8");//Encoding to UTF-8
$key1 = mb_convert_encoding($key, "UTF-8");//Encoding to UTF-8
//SecretKeyFactory Instance of PBKDF2WithHmacSHA1 Java Equivalent
$hash = openssl_pbkdf2($key1,$salt1,'256','65536', 'sha1');
$decrypted = openssl_decrypt($dataEncypted, $method, $hash, OPENSSL_RAW_DATA, $IVbytes);
return $decrypted;
}else{
return "Encrypted String to decrypt, Salt and Key is required.";
}
}
}
I am not able to decrypt a string generated using java using this PHP
Update
here is the text and key that i tried for encryption using the above java code
Random generated text (asp_secret) : DTosv9G179D0cY1985Uh2eF6ND80C95L
Random generated Key used (encKey): VEMwcCYfFpsrXQVIFTDrA/2zP/5PYOY6JC1XEkEcLGSk/klt+HqHzGSr781Yznku
Encrypted string using above java code (enc_asp_secret): zAnTcjmAezfdzrWGixyfwmb8cM0otrsmwJ8+cNDs48Axh9hYgBtCJyeSE9tCvEBz