La raison pour laquelle vous obtenez Invalid AES key length: 8 bytes invalid AES
est liée à la longueur de votre clé et de votre texte. Vous devez vous assurer que sa longueur en bits est une puissance de deux. Si vous souhaitez utiliser une chaîne de caractères comme clé de chiffrement, vérifiez sa longueur en octets et multipliez-la par 8 pour obtenir sa longueur en bits. En outre, la plupart des implémentations de chaînes nécessitent 2 octets pour chaque caractère (Java 64 bits). Des informations détaillées sont disponibles ici : Comment résoudre l'exception InvalidKeyException
Dans ce cas, l'erreur mentionnée disparaîtra si l'on utilise une clé plus longue ou rembourrée, par exemple :
static String PLAIN_TEXT = "SS18617710213463";
static String ENCRYPTION_KEY = "mykey@91mykey@91";
Cependant, il y a un autre élément important à prendre en compte. L'implémentation Java doit correspondre aux algorithmes exacts fournis par node.js. Ce n'est pas aussi facile qu'il y paraît (du moins d'après mon expérience). Dans votre cas, je vous suggère d'utiliser node-forge du côté de node.js qui est plus facile à faire correspondre aux implémentations Java :
var forge = require('node-forge');
var plaintext = 'SS18617710213463';
var key = 'mykey@91mykey@91';
var iv = 'AODVNUASDNVVAOVF';
console.log('Plain Text: ' + plaintext);
var cipher = forge.cipher.createCipher('AES-CBC', key);
cipher.start({iv: iv});
cipher.update(forge.util.createBuffer(plaintext));
cipher.finish();
var encrypted = cipher.output;
var encodedB64 = forge.util.encode64(encrypted.data);
console.log("Encoded: " + encodedB64);
var decodedB64 = forge.util.decode64(encodedB64);
encrypted.data = decodedB64;
var decipher = forge.cipher.createDecipher('AES-CBC', key);
decipher.start({iv: iv});
decipher.update(encrypted);
var result = decipher.finish();
console.log("Decoded: " + decipher.output.data);
En exécutant le code ci-dessus, la sortie devrait être :
Plain Text: SS18617710213463
Encoded: HCzZD7uc13fqfM6odWcXf/mdR4aNJfkMDhEbnU+asjE=
Decoded: SS18617710213463
Et le code Java compatible qui fonctionnera de la même manière ressemble au code ci-dessous :
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class Main {
static String PLAIN_TEXT = "SS18617710213463";
static String ENCRYPTION_KEY = "mykey@91mykey@91";
static String INITIALIZATIO_VECTOR = "AODVNUASDNVVAOVF";
public static void main(String [] args) {
try {
System.out.println("Plain text: " + PLAIN_TEXT);
byte[] encryptedMsg = encrypt(PLAIN_TEXT, ENCRYPTION_KEY);
String base64Encrypted = Base64.getEncoder().encodeToString(encryptedMsg);
System.out.println("Encrypted: "+ base64Encrypted);
byte[] base64Decrypted = Base64.getDecoder().decode(base64Encrypted);
String decryptedMsg = decrypt(base64Decrypted, ENCRYPTION_KEY);
System.out.println("Decrypted: " + decryptedMsg);
} catch (Exception e) {
e.printStackTrace();
}
}
public static byte[] encrypt(String plainText, String encryptionKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/pkcs5padding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.ENCRYPT_MODE, key,new IvParameterSpec(INITIALIZATIO_VECTOR.getBytes("UTF-8")));
return cipher.doFinal(plainText.getBytes("UTF-8"));
}
public static String decrypt(byte[] cipherText, String encryptionKey) throws Exception{
Cipher cipher = Cipher.getInstance("AES/CBC/pkcs5padding", "SunJCE");
SecretKeySpec key = new SecretKeySpec(encryptionKey.getBytes("UTF-8"), "AES");
cipher.init(Cipher.DECRYPT_MODE, key,new IvParameterSpec(INITIALIZATIO_VECTOR.getBytes("UTF-8")));
return new String(cipher.doFinal(cipherText),"UTF-8");
}
}
Ce qui produit :
Plain text: SS18617710213463
Encrypted: HCzZD7uc13fqfM6odWcXf/mdR4aNJfkMDhEbnU+asjE=
Decrypted: SS18617710213463