Backend Using Below Java code for the AES Encryption.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.xml.bind.DatatypeConverter;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* This example program shows how AES encryption and decryption can be done in Java.
* Please note that secret key and encrypted text is unreadable binary and hence
* in the following program we display it in hexadecimal format of the underlying bytes.
* @author Jayson
*/
public class AESEncryption {
/**
* 1. Generate a plain text for encryption
* 2. Get a secret key (printed in hexadecimal form). In actual use this must
* by encrypted and kept safe. The same key is required for decryption.
* 3.
*/
public static void main(String[] args) throws Exception {
String plainText = "rajaram";
String keyText ="test123";
SecretKey secKey = getSecretEncryptionKey(keyText);
System.out.println("secKey:" + secKey);
byte[] cipherText = encryptText(plainText, secKey);
String decryptedText = decryptText(cipherText, secKey);
System.out.println("Original Text:>>>> " + plainText);
System.out.println("AES Key (Hex Form):>>>> "+bytesToHex(secKey.getEncoded()));
System.out.println("Encrypted Text (Hex Form):>>>> "+bytesToHex(cipherText));
System.out.println("Descrypted Text:>>>> "+decryptedText);
}
public static SecretKey getSecretEncryptionKey(String keyText) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(getKey(keyText), "AES");
return keySpec;
}
public static byte[] getKey(String keyStr) {
byte[] key = null;
try {
key = (keyStr).getBytes("UTF-8");
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
System.out.println("SHA-1 key" + key);
key = Arrays.copyOf(key, 16);
System.out.println("copyOf SHA-1 16 key" + key);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("getKey" + key);
return key;
}
/**
* Encrypts plainText in AES using the secret key
* @param plainText
* @param secKey
* @return
* @throws Exception
*/
public static byte[] encryptText(String plainText,SecretKey secKey) throws Exception{
// AES defaults to AES/ECB/PKCS5Padding in Java 7
Cipher aesCipher = Cipher.getInstance("AES");
System.out.println("ENCRYPT_MODE:" + Cipher.ENCRYPT_MODE);
aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
System.out.println("plain Text getBytes:" + plainText.getBytes());
byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());
System.out.println("byte Cipher Text:" + byteCipherText);
return byteCipherText;
}
/**
* Decrypts encrypted byte array using the key used for encryption.
* @param byteCipherText
* @param secKey
* @return
* @throws Exception
*/
public static String decryptText(byte[] byteCipherText, SecretKey secKey) throws Exception {
// AES defaults to AES/ECB/PKCS5Padding in Java 7
Cipher aesCipher = Cipher.getInstance("AES");
aesCipher.init(Cipher.DECRYPT_MODE, secKey);
byte[] bytePlainText = aesCipher.doFinal(byteCipherText);
return new String(bytePlainText);
}
/**
* Convert a binary byte array into readable hex form
* @param hash
* @return
*/
private static String bytesToHex(byte[] hash) {
return DatatypeConverter.printHexBinary(hash);
}
}
Above Clas O/P:
getKey[B@6d06d69c
secKey:javax.crypto.spec.SecretKeySpec@fffe8c0a
ENCRYPT_MODE:1
plain Text getBytes:[B@34340fab
byte Cipher Text:[B@2aafb23c
Original Text:>>>> rajaram
AES Key (Hex Form):>>>> 7288EDD0FC3FFCBE93A0CF06E3568E28
Encrypted Text (Hex Form):>>>> 8E441411D9890BED64BD7931DE3230C3
Descrypted Text:>>>> rajaram
But I am unable to decryption using crypto-js.
Crypto-js code example for the frondend:
var bytes = CryptoJS.AES.decrypt("8E441411D9890BED64BD7931DE3230C3", "test123", { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
var plaintext = bytes.toString(CryptoJS.enc.Utf8);
alert(plaintext);
JS fiddle link : /
Anyone, crypto-js how to add SHA-1 16 key with AES/ECB/PKCS5Padding, Please suggest me how to resolve this issue.
Backend Using Below Java code for the AES Encryption.
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.xml.bind.DatatypeConverter;
import javax.crypto.spec.SecretKeySpec;
import java.security.MessageDigest;
import java.util.Arrays;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
/**
* This example program shows how AES encryption and decryption can be done in Java.
* Please note that secret key and encrypted text is unreadable binary and hence
* in the following program we display it in hexadecimal format of the underlying bytes.
* @author Jayson
*/
public class AESEncryption {
/**
* 1. Generate a plain text for encryption
* 2. Get a secret key (printed in hexadecimal form). In actual use this must
* by encrypted and kept safe. The same key is required for decryption.
* 3.
*/
public static void main(String[] args) throws Exception {
String plainText = "rajaram";
String keyText ="test123";
SecretKey secKey = getSecretEncryptionKey(keyText);
System.out.println("secKey:" + secKey);
byte[] cipherText = encryptText(plainText, secKey);
String decryptedText = decryptText(cipherText, secKey);
System.out.println("Original Text:>>>> " + plainText);
System.out.println("AES Key (Hex Form):>>>> "+bytesToHex(secKey.getEncoded()));
System.out.println("Encrypted Text (Hex Form):>>>> "+bytesToHex(cipherText));
System.out.println("Descrypted Text:>>>> "+decryptedText);
}
public static SecretKey getSecretEncryptionKey(String keyText) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(getKey(keyText), "AES");
return keySpec;
}
public static byte[] getKey(String keyStr) {
byte[] key = null;
try {
key = (keyStr).getBytes("UTF-8");
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
System.out.println("SHA-1 key" + key);
key = Arrays.copyOf(key, 16);
System.out.println("copyOf SHA-1 16 key" + key);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("getKey" + key);
return key;
}
/**
* Encrypts plainText in AES using the secret key
* @param plainText
* @param secKey
* @return
* @throws Exception
*/
public static byte[] encryptText(String plainText,SecretKey secKey) throws Exception{
// AES defaults to AES/ECB/PKCS5Padding in Java 7
Cipher aesCipher = Cipher.getInstance("AES");
System.out.println("ENCRYPT_MODE:" + Cipher.ENCRYPT_MODE);
aesCipher.init(Cipher.ENCRYPT_MODE, secKey);
System.out.println("plain Text getBytes:" + plainText.getBytes());
byte[] byteCipherText = aesCipher.doFinal(plainText.getBytes());
System.out.println("byte Cipher Text:" + byteCipherText);
return byteCipherText;
}
/**
* Decrypts encrypted byte array using the key used for encryption.
* @param byteCipherText
* @param secKey
* @return
* @throws Exception
*/
public static String decryptText(byte[] byteCipherText, SecretKey secKey) throws Exception {
// AES defaults to AES/ECB/PKCS5Padding in Java 7
Cipher aesCipher = Cipher.getInstance("AES");
aesCipher.init(Cipher.DECRYPT_MODE, secKey);
byte[] bytePlainText = aesCipher.doFinal(byteCipherText);
return new String(bytePlainText);
}
/**
* Convert a binary byte array into readable hex form
* @param hash
* @return
*/
private static String bytesToHex(byte[] hash) {
return DatatypeConverter.printHexBinary(hash);
}
}
Above Clas O/P:
getKey[B@6d06d69c
secKey:javax.crypto.spec.SecretKeySpec@fffe8c0a
ENCRYPT_MODE:1
plain Text getBytes:[B@34340fab
byte Cipher Text:[B@2aafb23c
Original Text:>>>> rajaram
AES Key (Hex Form):>>>> 7288EDD0FC3FFCBE93A0CF06E3568E28
Encrypted Text (Hex Form):>>>> 8E441411D9890BED64BD7931DE3230C3
Descrypted Text:>>>> rajaram
But I am unable to decryption using crypto-js.
Crypto-js code example for the frondend:
var bytes = CryptoJS.AES.decrypt("8E441411D9890BED64BD7931DE3230C3", "test123", { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
var plaintext = bytes.toString(CryptoJS.enc.Utf8);
alert(plaintext);
JS fiddle link : http://jsfiddle/baxfk6tw/
Anyone, crypto-js how to add SHA-1 16 key with AES/ECB/PKCS5Padding, Please suggest me how to resolve this issue.
Share Improve this question edited Nov 20, 2018 at 10:43 user10679480 asked Nov 20, 2018 at 10:41 user10679480user10679480 291 silver badge3 bronze badges 5- I'm not sure what the link is between the Java class and the JavaScript snippet. Can you please explain? – Federico klez Culloca Commented Nov 20, 2018 at 10:43
- Java class using for the AES encryption, CryptoJS using for decryption!. – user10679480 Commented Nov 20, 2018 at 10:48
- Ok, then what does "But I am unable to decryption using crypto-js." mean? You get an error? Wrong output? Please, include some more detail in your question. – Federico klez Culloca Commented Nov 20, 2018 at 10:49
- I am getting empty value while decrypting – user10679480 Commented Nov 20, 2018 at 10:50
- @rustyx can u please check and update the fiddle jsfiddle/rajaramtt/rbh0wkej – Raja Ram T Commented Nov 21, 2018 at 6:04
1 Answer
Reset to default 5You Java version does the following:
- Hash the password once with SHA1, then take the first 16 bytes as the key.
- Encrypt plaintext UTF-8 bytes with AES-128, ECB mode, PKCS7 padding.
- Convert ciphertext to Hex.
So to decrypt it with CryptoJS you need to repeat the same steps:
var ciphertext = CryptoJS.enc.Hex.parse("8E441411D9890BED64BD7931DE3230C3");
var pwhash = CryptoJS.SHA1(CryptoJS.enc.Utf8.parse("test123"));
var key = CryptoJS.enc.Hex.parse(pwhash.toString(CryptoJS.enc.Hex).substr(0, 32));
var decrypted = CryptoJS.AES.decrypt({
ciphertext: ciphertext
}, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
var plaintext = decrypted.toString(CryptoJS.enc.Utf8);
$('#result').text(plaintext);
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare./ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>
<h2 id="result">
For reference, encryption using CryptoJS might look like this:
var plaintext = "rajaram";
var pwhash = CryptoJS.SHA1(CryptoJS.enc.Utf8.parse("test123"));
var key = CryptoJS.enc.Hex.parse(pwhash.toString(CryptoJS.enc.Hex).substr(0, 32));
var encrypted = CryptoJS.AES.encrypt(plaintext, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
var ciphertext = encrypted.ciphertext.toString(CryptoJS.enc.Hex);
$('#encrypted').text(ciphertext);
<script src="https://ajax.googleapis./ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare./ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>
<h2 id="encrypted">