كيفية استخدام تشفير وفك تشفير 3DES في جافا
تتطلب التطبيقات الحديثة غالبًا وسيلة آمنة للتعامل مع البيانات الحساسة. واحدة من خوارزميات التشفير الشائعة التي قد تواجهها هي 3DES (معيار تشفير البيانات الثلاثي). إذا كنت تحاول تشفير وفك تشفير السلاسل باستخدام 3DES في جافا، فقد تواجه مشكلات، كما يتضح من مشكلة شائعة بين المطورين: عدم القدرة على فك تشفير رسالة إلى شكلها الأصلي. ستساعدك هذه المقالة على فهم كيفية استخدام تشفير وفك تشفير 3DES بشكل صحيح في جافا.
المشكلة
تخيل أنك كتبت بعض الأكواد لتشفير سلسلة نصية—دعنا نقول السلسلة “كيلي بون”. بعد تشغيل أسلوب التشفير الخاص بك، تحاول فك شيفرة النتيجة ولكن تفشل في استعادة السلسلة الأصلية. يواجه العديد من المطورين تحديًا مشابهًا، وغالبًا ما يكون ذلك بسبب التعامل غير الصحيح مع مصفوفات البايت أو نقص خطوات حاسمة في الكود الخاص بهم.
شارك أحد المطورين، “كل طريقة أكتبها لتشفير سلسلة نصية في جافا باستخدام 3DES لا يمكن فك تشفيرها مرة أخرى إلى السلسلة الأصلية.” تنشأ هذه الخطأ الشائع عادة من سوء الفهم لكيفية عمل مصفوفات البايت وتمثيلات السلاسل في جافا.
الحل
دعونا نلقي نظرة على تنفيذ مبسط ومصحح لتشفير وفك تشفير 3DES في جافا. تسمح لك هذه الشيفرة بتشفير إدخال نصي ثم فك تشفيره بسهولة إلى النص الأصلي.
شرح الكود خطوة بخطوة
-
استيرادات:
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 = "كيلي بون"; byte[] codedtext = new TripleDESTest().encrypt(text); String decodedtext = new TripleDESTest().decrypt(codedtext); System.out.println(codedtext); System.out.println(decodedtext); // "كيلي بون" }
-
طريقة التشفير: تقوم هذه الطريقة بتشفير الرسالة المدخلة باستخدام خوارزمية 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 في تطبيقات جافا الخاصة بك. من خلال اتباع الشرح أعلاه وأمثلة الكود، يمكنك تنفيذ هذه الطريقة القوية للتشفير بنجاح.