Heim >Java >javaLernprogramm >Warum sind die Anfangsbytes nach der Java AES/CBC-Entschlüsselung falsch und wie kann ich das beheben?
Anfangsbytes nach Java AES/CBC-Entschlüsselung falsch
Problem:
Beim Versuch Entschlüsseln Sie eine AES/CBC-verschlüsselte Zeichenfolge in Java, die ersten Bytes des entschlüsselten Ergebnisses sind fehlerhaft.
Beispiel:
Der folgende Code veranschaulicht das Problem:
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(); } }
Beim Ausführen dieses Codes sieht die entschlüsselte Ausgabe möglicherweise ähnlich aus zu:
Result: `£eB6O�geS��i are you? Have a nice day.
Lösung:
Die falschen Anfangsbytes in der entschlüsselten Zeichenfolge treten aufgrund fehlender Base64-Kodierung/Dekodierung bei der Verarbeitung der verschlüsselten/entschlüsselten Daten auf. Um dieses Problem zu beheben, sollte eine Base64-Kodierung an den verschlüsselten Bytes durchgeführt werden, bevor sie übertragen werden, und eine Base64-Dekodierung sollte an den empfangenen verschlüsselten Bytes durchgeführt werden, bevor sie entschlüsselt werden.
Aktualisiertes Beispiel:
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(); } }
Das obige ist der detaillierte Inhalt vonWarum sind die Anfangsbytes nach der Java AES/CBC-Entschlüsselung falsch und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!