CryptoJS AES xifrat i JAVA AES desxifrat de valors de desxifrat – java, javascript, xifrat, aes, cryptojs

Estic xifrant un text usant l’algoritme CryptoJS AES al costat de el client i ho estic desencriptando a el costat de servidor en Java, estic obtenint l’excepció.

Codi JS:

var encrypted = CryptoJS.AES.encrypt("Message", "Secret Passphrase");console.info("encrypted " + encrypted);var decrypted = CryptoJS.AES.decrypt(encrypted, "Secret Passphrase");var plainText = decrypted.toString(CryptoJS.enc.Utf8)console.info("decrypted " + plainText);

sortida js:

encrypted U2FsdGVkX1/uYgVsNZmpbgKQJ8KD+8R8yyYn5+irhoI=decrypted Message

Codi Java:

import java.nio.charset.Charset;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.NoSuchProviderException;import java.util.regex.Pattern;import javax.crypto.BadPaddingException;import javax.crypto.Cipher;import javax.crypto.IllegalBlockSizeException;import javax.crypto.KeyGenerator;import javax.crypto.NoSuchPaddingException;import javax.crypto.SecretKey;import javax.crypto.spec.SecretKeySpec;public class AESJavaScript {private SecretKeySpec key;private Cipher cipher;private int size = 128;private static final Charset CHARSET = Charset.forName("utf-8");public AESJavaScript() throws NoSuchAlgorithmException,NoSuchPaddingException, NoSuchProviderException {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(size); // 192 and 256 bits may not be availableSecretKey skey = kgen.generateKey();byte raw = skey.getEncoded();key = new SecretKeySpec(raw, "AES/CTR/NoPadding");cipher = Cipher.getInstance("AES/CTR/NoPadding");}public void setKey(String keyText) {byte bText = new byte;bText = keyText.getBytes(CHARSET);key = new SecretKeySpec(bText, "AES/CTR/NoPadding");}public String encrypt(String message) throws InvalidKeyException,IllegalBlockSizeException, BadPaddingException {cipher.init(Cipher.ENCRYPT_MODE, key);byte encrypted = cipher.doFinal(message.getBytes());return byteArrayToHexString(encrypted);}public String decrypt(String hexCiphertext)throws IllegalBlockSizeException, BadPaddingException,InvalidKeyException {cipher.init(Cipher.DECRYPT_MODE, key);byte decrypted = cipher.doFinal(hexStringToByteArray(hexCiphertext));return byteArrayToHexString(decrypted);}private static String byteArrayToHexString(byte raw) {String hex = "0x";String s = new String(raw);for (int x = 0; x < s.length(); x++) {char t = s.substring(x, x + 1).toCharArray();hex += Integer.toHexString((int) t).toUpperCase();}return hex;}private static byte hexStringToByteArray(String hex) {Pattern replace = Pattern.compile("^0x");String s = replace.matcher(hex).replaceAll("");byte b = new byte;for (int i = 0; i < b.length; i++) {int index = i * 2;int v = Integer.parseInt(s.substring(index, index + 2), 16);b = (byte) v;}return b;}public static void main(String args) {try {AESJavaScript ajs = new AESJavaScript();ajs.setKey("Secret Passphrase");String hexCiphertext = "U2FsdGVkX1/uYgVsNZmpbgKQJ8KD+8R8yyYn5+irhoI=";String decrypted = ajs.decrypt(hexCiphertext);System.out.println("decrypted > " + decrypted);} catch (Exception e) {e.printStackTrace();}}}

L’excepció és:

java.security.InvalidKeyException: Invalid AES key length: 17 bytesat com.sun.crypto.provider.AESCipher.engineGetKeySize(AESCipher.java:372)at javax.crypto.Cipher.passCryptoPermCheck(Cipher.java:1052)at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1010)at javax.crypto.Cipher.implInit(Cipher.java:786)at javax.crypto.Cipher.chooseProvider(Cipher.java:849)at javax.crypto.Cipher.init(Cipher.java:1213)at javax.crypto.Cipher.init(Cipher.java:1153)at com.test.jenkins.jenkinsRestart.AESJavaScript.decrypt(AESJavaScript.java:49)at com.test.jenkins.jenkinsRestart.AESJavaScript.main(AESJavaScript.java:82)

hi ha res que estic fent malament aquí o hi ha alguna altra manera senzilla de fer aquest tipus de xifrat i desxifrat?

Respostes

4 per a la resposta № 1

El seu codi Java està ple d’errors. Aquests són alguns d’ells:

  • La seva primera excepció és causada perquè el seu "Secret Passphrase" La cadena conté 17 bytes. Ha de truncar a 16 bytes (o omplir perquè coincideixi amb 24 o 32 bytes). Ha de coincidir amb el comportament de la biblioteca CryptoJS.

  • Està tractant de descodificar en hexadecimal les dades que semblen estar codificats en base64. Prova amb DatatypeConverter.parseBase64Binary(hex);.

  • Estàs creant una clau secreta amb l’algoritme. "AES/CTR/NoPadding". Això és invàlid, només fa servir "AES".

  • Ha de passar un valor IV / nonce al seu desxifrat:

    cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(...));

    El valor que utilitzi dependrà del que faci CryptoJS. ¿Potser fa servir tots els zeros? Potser genera un aleatori i necessites emmagatzemar amb el text xifrat?

Això hauria de ser suficient per començar.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *