วิธีใช้การเข้ารหัสและการถอดรหัส 3DES ใน Java
แอพพลิเคชั่นสมัยใหม่มักต้องการวิธีที่ปลอดภัยในการจัดการกับข้อมูลที่ละเอียดอ่อน อัลกอริธึมการเข้ารหัสที่ได้รับความนิยมอย่างหนึ่งที่คุณอาจพบคือ 3DES (Triple Data Encryption Standard) หากคุณพยายามเข้ารหัสและถอดรหัสสตริงโดยใช้ 3DES ใน Java คุณอาจประสบปัญหา เช่นที่แสดงโดยปัญหาทั่วไปในหมู่ผู้พัฒนา: ความไม่สามารถถอดรหัสข้อความกลับไปเป็นรูปแบบเดิมได้ บทความนี้จะช่วยให้คุณเข้าใจวิธีการใช้การเข้ารหัสและการถอดรหัส 3DES ได้อย่างถูกต้องใน Java
ปัญหา
ลองนึกภาพว่าคุณเขียนโค้ดเพื่อเข้ารหัสสตริง—สมมติว่าสตริง “kyle boon” หลังจากเรียกใช้วิธีการเข้ารหัสของคุณ คุณพยายามถอดรหัสผลลัพธ์ แต่ไม่สามารถนำกลับมาเป็นสตริงเดิมได้ ผู้พัฒนาหลายคนเผชิญกับความท้าทายที่คล้ายกัน มักเกิดจากการจัดการอาร์เรย์ของไบต์อย่างไม่ถูกต้องหรือพลาดขั้นตอนที่สำคัญในโค้ดของพวกเขา
นักพัฒนาคนหนึ่งได้แบ่งปันว่า “ทุกวิธีที่ฉันเขียนเพื่อเข้ารหัสสตริงใน Java โดยใช้ 3DES ไม่สามารถถอดรหัสกลับไปเป็นสตริงเดิมได้” ความผิดพลาดทั่วไปนี้มักเกิดจากความเข้าใจผิดเกี่ยวกับการทำงานของอาร์เรย์ของไบต์และการแทนที่สตริงใน Java
ทางออก
มาดูการใช้งานที่ง่ายและถูกต้องของการเข้ารหัสและการถอดรหัส 3DES ใน Java โค้ดนี้ช่วยให้คุณสามารถเข้ารหัสข้อความที่ระบุได้ และจากนั้นถอดรหัสกลับไปเป็นข้อความเดิมได้อย่างง่ายดาย
คำอธิบายโค้ดแบบทีละขั้นตอน
-
การนำเข้า:
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); System.out.println(decodedtext); // "kyle boon" }
-
วิธีการเข้ารหัส: วิธีนี้จะเข้ารหัสข้อความที่ป้อนโดยใช้อัลกอริธึม 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); }
-
วิธีการถอดรหัส: วิธีนี้จะกลับกระบวนการเข้ารหัส:
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 ของคุณ โดยปฏิบัติตามคำอธิบายและตัวอย่างโค้ดด้านบน คุณสามารถนำวิธีการเข้ารหัสที่ทรงพลังนี้ไปใช้ได้สำเร็จ