Cara Menggunakan Enkripsi dan Dekripsi 3DES dalam Java

Aplikasi modern seringkali memerlukan cara yang aman untuk menangani data sensitif. Salah satu algoritma enkripsi yang populer yang mungkin Anda temui adalah 3DES (Triple Data Encryption Standard). Jika Anda berusaha untuk mengenkripsi dan mendekripsi string menggunakan 3DES di Java, Anda mungkin akan menghadapi masalah, seperti yang diilustrasikan oleh masalah umum di kalangan pengembang: ketidakmampuan untuk mendekripsi pesan kembali ke bentuk aslinya. Postingan ini akan membantu Anda memahami cara menggunakan enkripsi dan dekripsi 3DES dengan benar dalam Java.

Masalah

Bayangkan Anda telah menulis beberapa kode untuk mengenkripsi sebuah string—katakanlah, string “kyle boon.” Setelah menjalankan metode enkripsi Anda, Anda mencoba untuk mendekode hasilnya tetapi gagal mendapatkan kembali string aslinya. Banyak pengembang mengalami tantangan serupa, sering kali disebabkan oleh penanganan array byte yang tidak tepat atau melewatkan langkah-langkah penting dalam kode mereka.

Seorang pengembang berbagi, “Setiap metode yang saya tulis untuk mengodekan sebuah string dalam Java menggunakan 3DES tidak dapat didekripsi kembali ke string aslinya.” Kesalahan umum ini biasanya berasal dari kesalahpahaman mengenai bagaimana array byte dan representasi string bekerja di Java.

Solusi

Mari kita lihat implementasi 3DES enkripsi dan dekripsi yang disederhanakan dan diperbaiki dalam Java. Kode ini memungkinkan Anda untuk mengenkripsi input teks dan kemudian dengan mudah mendekripsinya kembali ke teks asli.

Penjelasan Kode Langkah demi Langkah

  1. Impor:

    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;
    
  2. Definisi Kelas:

    public class TripleDESTest {
    
  3. Metode Utama: Dalam metode utama Anda, Anda akan terlebih dahulu mendefinisikan teks yang akan dienkripsi.

    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);
        System.out.println(decodedtext); // "kyle boon"
    }
    
  4. Metode Enkripsi: Metode ini mengkodekan pesan input menggunakan algoritma 3DES:

    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");
        return cipher.doFinal(plainTextBytes);
    }
    
  5. Metode Dekripsi: Metode ini membalikkan proses enkripsi:

    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"); // Mengonversi array byte menjadi string
    }
    

Intisari Kunci

  • Menangani Array Byte dengan Benar: Saat mendekode, pastikan Anda mengonversi array byte kembali menjadi string menggunakan new String(plainText, "UTF-8") daripada memanggil toString() pada array byte. Ini menghindari keluaran yang tidak relevan.

  • Pengenkodean Base64: Jika Anda berencana untuk mentransmisikan array byte yang dienkripsi melalui media teks, pertimbangkan untuk menggunakan pengkodean Base64. Pastikan untuk mendekode dengan benar selama dekripsi.

  • Penanganan Eksepsi: Kode ini mengandung penanganan eksepsi untuk mengelola berbagai kesalahan enkripsi, menjadikannya lebih tangguh.

Sekarang Anda memiliki pendekatan yang jelas dan efektif untuk menggunakan enkripsi dan dekripsi 3DES dalam aplikasi Java Anda. Dengan mengikuti penjelasan dan cuplikan kode di atas, Anda dapat menerapkan metode enkripsi yang kuat ini dengan sukses.