Java’da 3DES Şifreleme ve Açma Kullanma

Modern uygulamalar genellikle hassas verileri güvenli bir şekilde işlemek için güvenli bir yol gerektirir. Karşılaşabileceğiniz popüler şifreleme algoritmalarından biri 3DES (Üçlü Veri Şifreleme Standardı)‘dır. Java’da 3DES kullanarak dizeleri şifreleyip açmayı deniyorsanız, bazı sorunlarla karşılaşabilirsiniz. Bu, geliştiriciler arasında yaygın bir sorun olan mesajı orijinal formuna geri deşifre edememe durumu gibi örneklerle gösterilebilir. Bu gönderi, Java’da 3DES şifreleme ve açmanın nasıl doğru bir şekilde yapılacağını anlamanıza yardımcı olacaktır.

Sorun

Bir diziyi şifrelemek için bazı kodlar yazdığınızı hayal edin—örneğin, “kyle boon” dizisi. Şifreleme yöntemini çalıştırdıktan sonra, sonucu açmayı deniyor ancak orijinal diziyi geri alamıyorsunuz. Birçok geliştirici, genellikle byte dizilerini yanlış yönetmek veya kodlarında önemli adımları atlamak nedeniyle benzer bir zorlukla karşılaşmaktadır.

Bir geliştirici şöyle paylaştı: “Java’da 3DES kullanarak bir diziyi kodlamak için yazdığım her yöntem orijinal diziyi geri açamıyor.” Bu yaygın hata genellikle Java’daki byte dizileri ve dizelerin temsili hakkında yanlış anlamalardan kaynaklanmaktadır.

Çözüm

Java’da 3DES şifreleme ve açma işleminin basitleştirilmiş ve düzeltilmiş bir uygulamasına bakalım. Bu kod, bir metin girişi şifrelemenizi ve ardından kolayca orijinal metne geri açmanızı sağlar.

Adım Adım Kod Açıklaması

  1. İçerikler:

    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. Sınıf Tanımı:

    public class TripleDESTest {
    
  3. Ana Metot: Ana metot içinde, şifrelenecek metni tanımlayacaksınız.

    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. Şifreleme Metodu: Bu metot, girdi mesajını 3DES algoritması kullanarak şifreler:

    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. Açma Metodu: Bu metot şifreleme işlemini tersine çevirir:

    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"); // Byte dizisini dizgeye dönüştür
    }
    

Ana Hatlar

  • Byte Dizilerini Doğru Yönetme: Açma işlemi sırasında, byte dizisini new String(plainText, "UTF-8") kullanarak bir dizeye dönüştürdüğünüzden emin olun. Bunu yapmak, hatalı çıktılar almanızı önler.

  • Base64 Kodlaması: Eğer şifreli byte dizisini metin ortamında iletmeyi planlıyorsanız, Base64 kodlaması kullanmayı düşünün. Şifre açma sırasında düzgün bir şekilde çözümlemesini yapmayı unutmayın.

  • İstisna Yönetimi: Kod, çeşitli şifreleme hatalarını yönetmek için istisna yönetimi içerir, bu da sağlam olmasını sağlar.

Artık Java uygulamalarınızda 3DES şifreleme ve açma işlemini kullanmak için net ve etkili bir yaklaşımınız var. Yukarıdaki açıklama ve kod parçalarını takip ederek, bu güçlü şifreleme yöntemini başarılı bir şekilde uygulayabilirsiniz.