/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
private static final byte[] SALT = { (byte) 0xC7, (byte) 0xB5, (byte) 0x99,
(byte) 0xF4, (byte) 0x4B, (byte) 0x7C, (byte) 0x81, (byte) 0x77 };
private static final int ITERATION_COUNT = 65536;
private static final int KEY_LENGTH = 256;
private static final int IV_LENGTH = 16;
private Cipher eCipher;
private Cipher dCipher;
private byte[] encrypt;
private byte[] iv;
public CryptoUtils(String passPhrase) {
try {
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), SALT, ITERATION_COUNT, KEY_LENGTH);
SecretKey secretKeyTemp = secretKeyFactory.generateSecret(keySpec);
SecretKey secretKey = new SecretKeySpec(secretKeyTemp.getEncoded(), "AES");
eCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
eCipher.init(Cipher.ENCRYPT_MODE, secretKey);
dCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
iv = eCipher.getParameters().getParameterSpec(IvParameterSpec.class).getIV();
dCipher.init(Cipher.DECRYPT_MODE, secretKey, new IvParameterSpec(iv));
} catch (Exception ex) {
ex.printStackTrace();
}
}
public CryptoUtils(String passPhrase, String encryptedString) {
try {
System.out
.println
("Encrypted String : " + encryptedString
); SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
KeySpec keySpec = new PBEKeySpec(passPhrase.toCharArray(), SALT, ITERATION_COUNT, KEY_LENGTH);
SecretKey secretKeyTemp = secretKeyFactory.generateSecret(keySpec);
SecretKey secretKey = new SecretKeySpec(secretKeyTemp.getEncoded(),"AES");
encrypt = Base64.decodeBase64(encryptedString.toString());
System.out
.println
("Encrypt : " + encrypt
); eCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
eCipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] iv = extractIV();
System.out
.println
("HEX - 1 : " + Hex
.encodeHexString
("xo3HErgdU5/zIvfzafD9muZrakm+457Ujr6u6vAvSDs=".getBytes
("UTF8"))); System.out
.println
( "HEX : " + Hex
.encodeHexString
( iv
) ); System.out
.println
("IV : " + Base64
.encodeBase64
(iv
)); dCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
dCipher.init(Cipher.DECRYPT_MODE, secretKey,
new IvParameterSpec(iv));
} catch (Exception ex) {
ex.printStackTrace();
}
}
public String encrypt(String encrypt) {
String encStr = null;
try {
byte[] bytes = encrypt.getBytes("UTF8");
byte[] encrypted = encrypt(bytes);
byte[] cipherText = new byte[encrypted.length + iv.length];
System.arraycopy
(iv
, 0, cipherText
, 0, iv
.length
); System.arraycopy
(encrypted
, 0, cipherText
, iv
.length
, encrypted.length);
encStr = new String(Base64.encodeBase64(cipherText));
} catch (Exception ex) {
ex.printStackTrace();
}
return encStr;
}
public byte[] encrypt(byte[] plain) throws Exception {
return eCipher.doFinal(plain);
}
private byte[] extractIV() {
byte[] iv = new byte[IV_LENGTH];
System.arraycopy
(encrypt
, 0, iv
, 0, iv
.length
); return iv;
}
public String decrypt() {
String decStr = null;
try {
byte[] bytes = extractCipherText();
byte[] decrypted = decrypt(bytes);
decStr = new String(decrypted, "UTF8");
} catch (Exception ex) {
ex.printStackTrace();
}
return decStr;
}
private byte[] extractCipherText() {
byte[] ciphertext = new byte[encrypt.length - IV_LENGTH];
System.arraycopy
(encrypt
, 16, ciphertext
, 0, ciphertext
.length
); return ciphertext;
}
public byte[] decrypt(byte[] encrypt) throws Exception {
return dCipher.doFinal(encrypt);
}
public static String generateNewKey() {
String newKey = null;
try {
// Get the KeyGenerator
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(256); // 128, 192 and 256 bits available
// Generate the secret key specs.
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
newKey = new String(Base64.encodeBase64(raw));
} catch (Exception ex) {
ex.printStackTrace();
}
return newKey;
}
public static String generateNewSalt() {
String newSalt = null;
try {
byte[] salt = new byte[8];
// Generate random salt
SecureRandom rnd = new SecureRandom();
rnd.nextBytes(salt);
newSalt = Hex.encodeHexString(salt);
} catch (Exception ex) {
ex.printStackTrace();
}
return newSalt;
}
public static void main (String[] args) throws java.lang.Exception
{
try {
Field field = Class.forName("javax.crypto.JceSecurity").getDeclaredField("isRestricted");
field.setAccessible(true);
field.set(null, java.lang.Boolean.FALSE);
} catch (Exception ex) {
ex.printStackTrace();
}
String newKey = generateNewKey();
System.out
.println
("New Key: " + newKey
);
String newSalt = generateNewSalt();
System.out
.println
("New Salt: " + newSalt
);
String
key = "wV7AzhvrZDhlIJt4UZ1wJQZ+qgtU1dWZ+7Ia6Nld4wk="; String str = "xo3HErgdU5/zIvfzafD9muZrakm+457Ujr6u6vAvSDs=";
System.out
.println
("Original String: " + str
);
String s1 = "7morqFA4B2/xtn8LXOH3wFvozYJpO+os+x9xgo/LQf299GKAQoTxP7s57Bd769Y7a/jLMX8tqsA4IVDCAC245t3SD2F/oGikrfdxQCr1Z0uytZIHctuWzYpN+ZR7suFh";
byte[] bytes = Base64.decodeBase64(s1);
String s2 = new String(bytes);
//Base64.decodeBase64(s1);
System.out
.println
("the string " + s2
); /*AES256 aesEncrypt = new AES256(key);
String encryptedStr = aesEncrypt.encrypt(str);
System.out.println("Encrypted String: " + encryptedStr);
AES256 aesDecrypt = new AES256(key, encryptedStr);
String decryptedStr = aesDecrypt.decrypt();
System.out.println("Decrypted String: " + decryptedStr);
String key = "xh7G5+KBmA57N7RkXxhO6l1GpJWc/VHbiwCcN2O7vLM=";
String str = "Hello World!";
System.out.println("Original String: " + str);*/
String merchantKey = "xo3HErgdU5/zIvfzafD9muZrakm+457Ujr6u6vAvSDs=";
String msg = "ag|171120150003|12345|15000|IND|INR|Online|1|15000|Electronics|MerchantSuccess.html|MerchantFailure.html|IFrame";
CryptoUtils aesEncrypt = new CryptoUtils(merchantKey);
String encryptedStr = aesEncrypt.encrypt(msg);
System.out
.println
("Encrypted String: " + encryptedStr
); //"usy9Z/6QkJyQVcufN/J391ZCAv 4IJ17e8M3BTj1GYhqv964zrDXMa0TCkXHOZyJQ5FVLrK3hd6i/1EfekbZJ8 0JstgX3wMVsThsd8blIHKG0M B21jmPK5qal/g2wR0EPjPSDc9ean8at9NtBJ8qkTZmhHTEyjHAENAJAJ/uU="
//"jRcR+NL2y4Csq59YIyd1E+UcdXl+FKDgaOwCnqRmGRHEQ6ZcSYpxEGO+JZx1dQyuRQVsxjeLI3ILoUjNUtn8I3okuPRMR5KPzXcI5iI4FzwwoBnGQMAdliKejAgkPV2JFZe5mBcWi1Z7TW8xlAHUg3eZVR9RmiuU8j4fez6wMVo="
/*String eString = "xo3HErgdU5/zIvfzafD9muZrakm+457Ujr6u6vAvSDs=";
CryptoUtils aesDecrypt = new CryptoUtils(eString, "U2FsdGVkX19pw/KVybNcOL/34QyeTrSQoUVkhqCyTsizXX9N94bBGOdy/EmVN1aKcyvbzpOAiP5KA4Qr+lBi3aprudeAJZp6xu6EfESQuPLlcbbSgYedic4PyQk0Jfwo+NP2BLDfc8bIuD/w8PcC5A==");
String decryptedStr = aesDecrypt.decrypt();
System.out.println("Decrypted String: " + decryptedStr);*/
//String eString = "xo3HErgdU5/zIvfzafD9muZrakm+457Ujr6u6vAvSDs=";
CryptoUtils aesDecrypt = new CryptoUtils(merchantKey, "usy9Z/6QkJyQVcufN/J391ZCAv 4IJ17e8M3BTj1GYhqv964zrDXMa0TCkXHOZyJQ5FVLrK3hd6i/1EfekbZJ8 0JstgX3wMVsThsd8blIHKG0M B21jmPK5qal/g2wR0EPjPSDc9ean8at9NtBJ8qkTZmhHTEyjHAENAJAJ/uU=");
//CryptoUtils aesDecrypt = new CryptoUtils(merchantKey, "Fz7flXHzjzHdxe5Ct6S1xQUL7Ni9XcnxarO/KljjNEwOlMcazib1oi3rUuIjoJOaWB308krkeMBG52IuD1sezqEdd/MLcWj5iuyzzNXvBlW1WoaqBGo+joZQyArAOTPBzp+miKXfYZXS1kwKfvv8ZQ==");
String decryptedStr = aesDecrypt.decrypt();
System.out
.println
("Decrypted String: " + decryptedStr
); }
}