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
Freigeben: 2024-11-29 08:00:17
Original
487 Leute haben es durchsucht

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();
  }
}
Nach dem Login kopieren

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.
Nach dem Login kopieren

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();
  }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage