Rumah >Java >javaTutorial >Mengapa penyulitan dan penyahsulitan 3DES di Jawa biasanya gagal menyahsulit teks sifir kembali kepada rentetan asal, dan bagaimana isu ini boleh diselesaikan?

Mengapa penyulitan dan penyahsulitan 3DES di Jawa biasanya gagal menyahsulit teks sifir kembali kepada rentetan asal, dan bagaimana isu ini boleh diselesaikan?

Patricia Arquette
Patricia Arquetteasal
2024-11-11 03:21:02313semak imbas

Why does 3DES encryption and decryption in Java usually fail to decrypt the ciphertext back to the original string, and how can this issue be resolved?

Penyulitan dan Penyahsulitan 3DES dalam Java

Biasanya, masalah biasa berlaku apabila menggunakan 3DES untuk menyulitkan dan menyahsulit rentetan dalam Java, mengakibatkan ketidakupayaan untuk berjaya menyahsulit teks sifir Kembalikan rentetan asal. Artikel ini menyediakan contoh kod ringkas yang boleh menyulitkan dan menyahsulit rentetan dan memulihkannya kepada rentetan asal.

Dalam soalan asal, kod yang diberikan mempunyai ralat berikut:

  • Dalam kaedah penyulitan, hasil penyulitan dikembalikan terus dan bukannya pengekodan Base64.
  • Dalam kaedah penyahsulitan, hasil penyulitan digunakan secara langsung sebagai input data yang dinyahsulit dan bukannya penyahkod Base64 terlebih dahulu.

Kod yang diperbetulkan adalah seperti berikut:

import java.security.MessageDigest;
import java.util.Arrays;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;

public class TripleDESTest {

    public static void main(String[] args) throws Exception {

        String text = "kyle boon";

        byte[] codedtext = new TripleDESTest().encrypt(text);
        String decodedtext = new TripleDESTest().decrypt(codedtext);

        System.out.println(codedtext); // this is a byte array, you'll just see a reference to an array
        System.out.println(decodedtext); // This correctly shows "kyle boon"
    }

    public byte[] encrypt(String message) throws Exception {
        final MessageDigest md = MessageDigest.getInstance("md5");
        final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
                .getBytes("utf-8"));
        final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
        for (int j = 0, k = 16; j < 8;) {
            keyBytes[k++] = keyBytes[j++];
        }

        final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
        final Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, key, iv);

        final byte[] plainTextBytes = message.getBytes("utf-8");
        final byte[] cipherText = cipher.doFinal(plainTextBytes);
        final String encodedCipherText = new sun.misc.BASE64Encoder()
                .encode(cipherText);

        return cipherText;
    }

    public String decrypt(byte[] message) throws Exception {
        final MessageDigest md = MessageDigest.getInstance("md5");
        final byte[] digestOfPassword = md.digest("HG58YZ3CR9"
                .getBytes("utf-8"));
        final byte[] keyBytes = Arrays.copyOf(digestOfPassword, 24);
        for (int j = 0, k = 16; j < 8;) {
            keyBytes[k++] = keyBytes[j++];
        }

        final SecretKey key = new SecretKeySpec(keyBytes, "DESede");
        final IvParameterSpec iv = new IvParameterSpec(new byte[8]);
        final Cipher decipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        decipher.init(Cipher.DECRYPT_MODE, key, iv);

        final byte[] encData = new sun.misc.BASE64Decoder().decodeBuffer(message);
        final byte[] plainText = decipher.doFinal(encData);

        return new String(plainText, "UTF-8");
    }
}

Selepas menggunakan langkah pengekodan dan penyahkodan Base64 yang betul, kod tersebut boleh berjaya menyulitkan dan menyahsulit rentetan dan memastikan hasil yang didekripsi dipulihkan dengan betul kepada rentetan asal.

Atas ialah kandungan terperinci Mengapa penyulitan dan penyahsulitan 3DES di Jawa biasanya gagal menyahsulit teks sifir kembali kepada rentetan asal, dan bagaimana isu ini boleh diselesaikan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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