Heim >Java >javaLernprogramm >Warum sind die Anfangsbytes nach der Java AES/CBC-Entschlüsselung falsch und wie kann ich das beheben?

Warum sind die Anfangsbytes nach der Java AES/CBC-Entschlüsselung falsch und wie kann ich das beheben?

DDD
DDDOriginal
2024-11-29 08:00:17486Durchsuche

Why are the initial bytes incorrect after Java AES/CBC decryption, and how can I fix it?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn