Rumah  >  Artikel  >  Java  >  Mengapakah kod penyulitan/penyahsulitan Java 3DES saya gagal menyahsulit data yang dikodkan kembali kepada rentetan asal walaupun selepas mengalih keluar pengekodan dan penyahkodan Base64?

Mengapakah kod penyulitan/penyahsulitan Java 3DES saya gagal menyahsulit data yang dikodkan kembali kepada rentetan asal walaupun selepas mengalih keluar pengekodan dan penyahkodan Base64?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-11 08:11:03270semak imbas

Why does my Java 3DES encryption/decryption code fail to decrypt the encoded data back to the original string even after removing Base64 encoding and decoding?

Bagaimana cara saya menggunakan penyulitan/penyahsulitan 3DES dalam Java tanpa pengekodan Base64?

Isu:

Kod Java pengguna untuk penyulitan dan penyahsulitan 3DES gagal menyahsulit data dikodkan kembali kepada rentetan asal. Walaupun mengalih keluar pengekodan dan penyahkodan Base64, kod itu masih menghadapi masalah.

Penyelesaian:

Setelah menyemak kod yang disediakan, nampaknya ralat mungkin tidak terletak pada Base64 pengekodan atau proses penyahkodan tetapi sebaliknya dalam pengendalian output tatasusunan bait daripada penyulitan proses.

Kod Disemak:

Kod yang disemak berikut termasuk pembersihan kecil dan memaparkan "kyle boon" dengan betul sebagai rentetan yang dinyahkod:

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);

        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[] plainText = decipher.doFinal(message);

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

Atas ialah kandungan terperinci Mengapakah kod penyulitan/penyahsulitan Java 3DES saya gagal menyahsulit data yang dikodkan kembali kepada rentetan asal walaupun selepas mengalih keluar pengekodan dan penyahkodan Base64?. 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