I need to encrypt certainly string from client-side (JavaScript) and decrypt from server-side (Java), so I found CryptoJS and I write the code with the same params/configuration of mi Java Code but the output is always different, do you have any idea or what happen?
I'm use CBC with NoPadding
CryptoJS
http://jsfiddle.net/Soldier/gCHAG/
<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"> </script> <script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/components/pad-nopadding-min.js"></script> <script> function padString(source) { var paddingChar = ' '; var size = 16; var x = source.length % size; var padLength = size - x; for (var i = 0; i < padLength; i++) source += paddingChar; return source; } var key = CryptoJS.enc.Hex.parse('0123456789abcdef'); var iv = CryptoJS.enc.Hex.parse('fedcba9876543210'); var message = "soldier"; var padMsg = padString(message); var encrypted = CryptoJS.AES.encrypt(padMsg, key, { iv: iv, padding: CryptoJS.pad.NoPadding, mode: CryptoJS.mode.CBC}); console.log("Encrypted: "+encrypted); console.log("Encrypted text: "+encrypted.ciphertext); </script> Java Code
import java.security.Key; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import sun.misc.*; public class AesCipher { private static final String algorithm = "AES/CBC/NoPadding"; private static final byte[] keyValue = new byte[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; private static final byte[] ivValue = new byte[] { 'f', 'e', 'd', 'c', 'b', 'a', '9', '8', '7', '6', '5', '4', '3', '2', '1', '0' }; private static final IvParameterSpec ivspec = new IvParameterSpec(ivValue); private static final SecretKeySpec keyspec = new SecretKeySpec(keyValue, "AES"); final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); public static String encrypt(String Data) throws Exception { Cipher c = Cipher.getInstance(algorithm); c.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); byte[] encVal = c.doFinal(Data.getBytes()); String encryptedValue = new BASE64Encoder().encode(encVal); return encryptedValue; } public static String decrypt(String encryptedData) throws Exception { Cipher c = Cipher.getInstance(algorithm); c.init(Cipher.DECRYPT_MODE, keyspec, ivspec); byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData); byte[] decValue = c.doFinal(decordedValue); String decryptedValue = new String(decValue); return decryptedValue; } public static String bytesToHex(byte[] bytes) { char[] hexChars = new char[bytes.length * 2]; int v; for ( int j = 0; j < bytes.length; j++ ) { v = bytes[j] & 0xFF; hexChars[j * 2] = hexArray[v >>> 4]; hexChars[j * 2 + 1] = hexArray[v & 0x0F]; } return new String(hexChars); } private static String padString(String source) { char paddingChar = ' '; int size = 16; int x = source.length() % size; int padLength = size - x; for (int i = 0; i < padLength; i++) { source += paddingChar; } return source; } public static void main(String[] args) throws Exception { String password = "soldier"; String passwordEnc = AesCipher.encrypt(padString(password)); String passwordDec = AesCipher.decrypt(passwordEnc); System.out.println("Plain Text : " + password); System.out.println("Encrypted Text : " + passwordEnc); System.out.println("Decrypted Text : " + passwordDec); } } Original string:
soldier Output from CryptoJS:
Encrypted: VNzZNKJTqfRbM7zO/M4cDQ== Encrypted Hex: 54dcd934a253a9f45b33bccefcce1c0d Output from Java Code:
Encrypted: j6dSmg2lfjY2RpN91GNgNw== Encrypted Hex: 6a3664536d67326c666a593252704e3931474e674e773d3d The base64 string encrypted has same length but not the hex. If I put the output result of CryptoJS in Java Code, the decryption is incorrect.
Regards,