Maison >Java >javaDidacticiel >Pourquoi les octets initiaux sont-ils incorrects après le décryptage Java AES/CBC et comment puis-je y remédier ?
Octets initiaux incorrects après le décryptage Java AES/CBC
Problème :
Lors de la tentative de déchiffrer une chaîne chiffrée AES/CBC en Java, les octets initiaux du résultat déchiffré sont erroné.
Exemple :
Le code suivant illustre le problème :
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; public class AESEncryptionExample { public static void encryptDecryptString() { try { String key = "mySecretKey"; String value = "This is a test message"; String initVector = "initializationVector"; // 16-byte (128-bit) initialization vector IvParameterSpec iv = new IvParameterSpec(initVector.getBytes()); SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES"); // Create encrypt cipher Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); encryptCipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encryptedBytes = encryptCipher.doFinal(value.getBytes()); // Create decrypt cipher Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); decryptCipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); byte[] decryptedBytes = decryptCipher.doFinal(encryptedBytes); System.out.println("Original: " + value); System.out.println("Decrypted: " + new String(decryptedBytes)); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { encryptDecryptString(); } }
Lors de l'exécution de ce code, la sortie déchiffrée peut apparaître similaire à :
Result: `£eB6O�geS��i are you? Have a nice day.
Résolution :
Les octets initiaux incorrects dans la chaîne déchiffrée se produisent en raison de l'encodage/décodage Base64 manquant lors du traitement des données cryptées/déchiffrées. Pour résoudre ce problème, le codage Base64 doit être effectué sur les octets chiffrés avant de les transmettre et le décodage Base64 doit être effectué sur les octets chiffrés reçus avant de les déchiffrer.
Exemple mis à jour :
import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class CipherAESBase64 { public static void encryptDecryptString() { try { String key = "mySecretKey"; String value = "This is a test message"; String initVector = "initializationVector"; // 16-byte (128-bit) initialization vector IvParameterSpec iv = new IvParameterSpec(initVector.getBytes()); SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes(), "AES"); // Create encrypt cipher Cipher encryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); encryptCipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); byte[] encryptedBytes = encryptCipher.doFinal(value.getBytes()); // Encode the encrypted bytes into a Base64 string String encryptedString = Base64.getEncoder().encodeToString(encryptedBytes); // Create decrypt cipher Cipher decryptCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); decryptCipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); // Decode the encrypted Base64 string into bytes byte[] decryptedBytes = Base64.getDecoder().decode(encryptedString); // Decrypt the decoded bytes byte[] decryptedBytes = decryptCipher.doFinal(decryptedBytes); System.out.println("Original: " + value); System.out.println("Decrypted: " + new String(decryptedBytes)); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { encryptDecryptString(); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!