Rumah > Java > javaTutorial > Mengapakah bait awal tidak betul selepas penyahsulitan Java AES/CBC, dan bagaimanakah saya boleh membetulkannya?

Mengapakah bait awal tidak betul selepas penyahsulitan Java AES/CBC, dan bagaimanakah saya boleh membetulkannya?

DDD
Lepaskan: 2024-11-29 08:00:17
asal
417 orang telah melayarinya

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

Bait Awal Tidak Betul Selepas Penyahsulitan Java AES/CBC

Isu:

Apabila cuba untuk menyahsulit rentetan yang disulitkan AES/CBC di Jawa, bait awal hasil yang disulitkan ialah salah.

Contoh:

Kod berikut menunjukkan isu:

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();
  }
}
Salin selepas log masuk

Apabila menjalankan kod ini, output yang dinyahsulit mungkin kelihatan serupa kepada:

Result: `£eB6O�geS��i are you? Have a nice day.
Salin selepas log masuk

Penyelesaian:

Bait awal yang salah dalam rentetan yang dinyahsulit berlaku disebabkan pengekodan/penyahkodan Base64 yang hilang semasa mengendalikan data yang disulitkan/dinyahsulit. Untuk menyelesaikan masalah ini, pengekodan Base64 hendaklah dilakukan pada bait yang disulitkan sebelum menghantarnya dan penyahkodan Base64 hendaklah dilakukan pada bait yang disulitkan yang diterima sebelum menyahsulitnya.

Contoh Dikemas kini:

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();
  }
}
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapakah bait awal tidak betul selepas penyahsulitan Java AES/CBC, dan bagaimanakah saya boleh membetulkannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan