วิธีใช้การเข้ารหัสและการถอดรหัส 3DES ใน Java

แอพพลิเคชั่นสมัยใหม่มักต้องการวิธีที่ปลอดภัยในการจัดการกับข้อมูลที่ละเอียดอ่อน อัลกอริธึมการเข้ารหัสที่ได้รับความนิยมอย่างหนึ่งที่คุณอาจพบคือ 3DES (Triple Data Encryption Standard) หากคุณพยายามเข้ารหัสและถอดรหัสสตริงโดยใช้ 3DES ใน Java คุณอาจประสบปัญหา เช่นที่แสดงโดยปัญหาทั่วไปในหมู่ผู้พัฒนา: ความไม่สามารถถอดรหัสข้อความกลับไปเป็นรูปแบบเดิมได้ บทความนี้จะช่วยให้คุณเข้าใจวิธีการใช้การเข้ารหัสและการถอดรหัส 3DES ได้อย่างถูกต้องใน Java

ปัญหา

ลองนึกภาพว่าคุณเขียนโค้ดเพื่อเข้ารหัสสตริง—สมมติว่าสตริง “kyle boon” หลังจากเรียกใช้วิธีการเข้ารหัสของคุณ คุณพยายามถอดรหัสผลลัพธ์ แต่ไม่สามารถนำกลับมาเป็นสตริงเดิมได้ ผู้พัฒนาหลายคนเผชิญกับความท้าทายที่คล้ายกัน มักเกิดจากการจัดการอาร์เรย์ของไบต์อย่างไม่ถูกต้องหรือพลาดขั้นตอนที่สำคัญในโค้ดของพวกเขา

นักพัฒนาคนหนึ่งได้แบ่งปันว่า “ทุกวิธีที่ฉันเขียนเพื่อเข้ารหัสสตริงใน Java โดยใช้ 3DES ไม่สามารถถอดรหัสกลับไปเป็นสตริงเดิมได้” ความผิดพลาดทั่วไปนี้มักเกิดจากความเข้าใจผิดเกี่ยวกับการทำงานของอาร์เรย์ของไบต์และการแทนที่สตริงใน Java

ทางออก

มาดูการใช้งานที่ง่ายและถูกต้องของการเข้ารหัสและการถอดรหัส 3DES ใน Java โค้ดนี้ช่วยให้คุณสามารถเข้ารหัสข้อความที่ระบุได้ และจากนั้นถอดรหัสกลับไปเป็นข้อความเดิมได้อย่างง่ายดาย

คำอธิบายโค้ดแบบทีละขั้นตอน

  1. การนำเข้า:

    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. การกำหนดคลาส:

    public class TripleDESTest {
    
  3. วิธีหลัก: ในวิธีหลักของคุณ คุณจะเริ่มต้นด้วยการกำหนดข้อความที่จะเข้ารหัส

    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. วิธีการเข้ารหัส: วิธีนี้จะเข้ารหัสข้อความที่ป้อนโดยใช้อัลกอริธึม 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. วิธีการถอดรหัส: วิธีนี้จะกลับกระบวนการเข้ารหัส:

    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"); // แปลงอาร์เรย์ของไบต์เป็นสตริง
    }
    

ข้อคิดที่สำคัญ

  • จัดการอาร์เรย์ของไบต์ให้ถูกต้อง: เมื่อทำการถอดรหัส ให้แน่ใจว่าคุณแปลงอาร์เรย์ของไบต์กลับไปเป็นสตริงโดยใช้ new String(plainText, "UTF-8") แทนที่จะเรียกใช้ toString() กับมัน นี่จะช่วยหลีกเลี่ยงการได้รับผลลัพธ์ที่ไม่ถูกต้อง

  • การเข้ารหัสแบบ Base64: หากคุณวางแผนที่จะส่งอาร์เรย์ของไบต์ที่ถูกเข้ารหัสผ่านสื่อข้อความ ให้พิจารณาใช้การเข้ารหัส Base64 และให้แน่ใจว่าคุณถอดรหัสอย่างเหมาะสมในระหว่างการถอดรหัส

  • การจัดการข้อยกเว้น: โค้ดนี้มีการจัดการข้อยกเว้นเพื่อจัดการกับข้อผิดพลาดต่าง ๆ ที่เกิดจากการเข้ารหัส ทำให้มันมีความแข็งแกร่ง

ตอนนี้คุณมีวิธีที่ชัดเจนและมีประสิทธิภาพในการใช้การเข้ารหัสและการถอดรหัส 3DES ในแอพพลิเคชั่น Java ของคุณ โดยปฏิบัติตามคำอธิบายและตัวอย่างโค้ดด้านบน คุณสามารถนำวิธีการเข้ารหัสที่ทรงพลังนี้ไปใช้ได้สำเร็จ