انتقل إلى المحتوى

ابحث في CooLWJ

选择搜索范围,输入关键词后按回车。

اللغة

فن التشفير وفك التشفير

أولًا التشفير المتماثل

التشفير المتماثل والتشفير غير المتماثل طريقتان مختلفتان للتشفير، وتؤديان دورًا مهمًا في أمن البيانات ونقل المعلومات. سأقدم فيما يلي كلًا من تقنيتي التشفير هاتين:

1.1 التشفير المتماثل(Symmetric Encryption)

يعني التشفير المتماثل استخدام المفتاح نفسه للتشفير وفك التشفير. وهذا يعني أن على المرسل والمستقبل كليهما امتلاك هذا المفتاح لإجراء عمليتَي التشفير وفك التشفير.

خوارزميات التشفير المتماثل الشائعة:

  • AES (معيار التشفير المتقدم)

  • DES(معيار تشفير البيانات)

  • 3DES(خوارزمية تشفير البيانات الثلاثية)

1.2 خصائص التشفير المتماثل

عمومًا، يتّصف التشفير المتماثل بالخصائص التالية:

  1. سرعة مرتفعة نسبيًا: بما أن التشفير وفك التشفير يستخدمان المفتاح نفسه، يكون التشفير المتماثل عادةً أسرع من التشفير غير المتماثل.

  2. إدارة المفاتيح:يتمثل التحدي الرئيسي للتشفير المتماثل في توزيع المفاتيح وإدارتها. وإذا تسرّب المفتاح، يصبح أمن التشفير مهددًا.

  3. مناسب للكميات الكبيرة من البيانات: نظرًا إلى سرعته، يناسب التشفير المتماثل تشفير كميات كبيرة من البيانات.

يتضح من هذا أن للتشفير المتماثل ميزتين رئيسيتين:الأولى سرعة العمليات الحسابية؛ والثانية ملاءمته لكميات كبيرة من البيانات.

لكن للتشفير المتماثل مشكلة حاسمة، وهي إدارة المفاتيح. فكيفية نقل المفتاح بأمان من الخادم إلى العميل تمثل مشكلة! كذلك، عند الاتصال من طرف واحد إلى أطراف متعددة، تشكل إدارة المفاتيح لمنع تسربها تحديًا أيضًا. وهذا من أوجه قصور التشفير المتماثل.

صورة فنية لجدار أخضر مزرق وأسطوانة طلاء

1.3 مثال برمجي

بعد ذلك، سيوضّح لكم الأخ سونغ كيفية إجراء التشفير وفك التشفير المتماثلين باستخدام شيفرة Java.

لتنفيذ التشفير المتماثل في Java، تُستخدم عادةً الأصناف والواجهات التي توفّرها بنية Java للتشفير (Java Cryptography Architecture, JCA).

فيما يلي مثال بسيط على التشفير المتماثل وفكّه باستخدام خوارزمية AES(معيار التشفير المتقدّم):

public class SymmetricEncryptionExample {    // 生成密钥
    public static SecretKey generateKey() throws Exception {     
       KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128); // 可以是128, 192或256位
        return keyGenerator.generateKey();
    }    
    // 加密方法
    public static String encrypt(String data, SecretKey key) throws Exception {      
      Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);       
         byte[] encryptedBytes = cipher.doFinal(data.getBytes());        
         return Base64.getEncoder().encodeToString(encryptedBytes);
    }    
    // 解密方法
    public static String decrypt(String encryptedData, SecretKey key) throws Exception {        
    Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);       
         byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));       
          return new String(decryptedBytes);
    }    
    public static void main(String[] args) {        
    try {           
             // 生成密钥
            SecretKey key = generateKey();           
             // 原始数据
            String originalData = "Hello, JavaBoy!";            
            // 加密
            String encryptedData = encrypt(originalData, key);
            System.out.println("加密数据: " + encryptedData);            
            // 解密
            String decryptedData = decrypt(encryptedData, key);
            System.out.println("解密数据: " + decryptedData);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. توليد المفتاح:استخدام KeyGenerator إنشاء مفتاح AES.

  2. التشفير:استخدام Cipher فئة لإجراء التشفير، بتحويل البيانات إلى بايتات ثم تشفيرها، واستخدام ترميز Base64 لتحويلها إلى سلسلة نصية، لتسهيل تخزينها أو نقلها.

  3. فك التشفير:فك ترميز السلسلة المشفرة لإعادتها إلى بايتات، ثم فك تشفيرها باستخدام المفتاح نفسه.

ما ينبغي الانتباه إليه في الشيفرة أعلاه هو:

  • ينبغي اختيار طول المفتاح(مثل 128 بت)وفقًا للمتطلبات الأمنية.

  • احرص على تخزين المفاتيح بأمان، ولا تكتبها مباشرةً داخل الشيفرة.

  • في بيئة الإنتاج، ينبغي النظر في استخدام استراتيجية أكثر أمانًا لإدارة المفاتيح.

لاعتبارات أمنية، نستخدم عادةً الطريقة السابقة لتوليد المفتاح. ومن خصائص المفتاح الناتج بهذه الطريقة أنه يتغيّر كلما أُعيد تشغيل النظام. وإذا أردت التحكّم بنفسك في توليد المفتاح، فيمكنك توليده بالطريقة التالية:

public static SecretKey generateKeyFromPassword(String password, int keySize) throws NoSuchAlgorithmException, InvalidKeySpecException {   
  SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");   
   KeySpec spec = new PBEKeySpec(password.toCharArray(), "salt".getBytes(), 65536, keySize);   
   return new SecretKeySpec(factory.generateSecret(spec).getEncoded(), "AES");
}

وبذلك يمكن التحكم بالمفتاح عبر المعلمات التي تمررها بنفسك.

1.4 التكامل بين الواجهة الأمامية والخلفية

عند استخدام خوارزمية AES للتشفير وفك التشفير بين لغات مختلفة(مثل JavaScript وJava)، يكمن الأمر الأساسي في التأكد من استخدام الطرفين المفتاح نفسه، ونمط الخوارزمية نفسه(مثل CBC, ECB وغيرهما)، ونمط الحشو نفسه(مثل PKCS5Padding, PKCS7Padding وغيرهما)، ومتجه التهيئة نفسه(IV، إذا استُخدم نمط يتطلب IV مثل CBC).

ذكر أحد الأصدقاء سابقًا أنه كلّما شفّر البيانات في الواجهة الأمامية، تعذّر على الخادم فكّ تشفيرها؛ لذا سأقدّم أنا، الأخ سونغ، هنا أيضًا مثالًا يجمع بين الواجهة الأمامية والخادم.

التشفير في الواجهة الأمامية وفك التشفير في الواجهة الخلفية

شيفرة الواجهة الأمامية:

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>AES加密示例</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
    </head>
    <body>
    <script>
    function encryptAES(text, secretKey) {        
    const key = CryptoJS.enc.Utf8.parse(secretKey);        
    const iv = CryptoJS.lib.WordArray.random(128 / 8); 
    // 对于CBC模式,需要IV
    
        const encrypted = CryptoJS.AES.encrypt(text, key, {           
         iv: iv,           
          mode: CryptoJS.mode.CBC,            
          padding: CryptoJS.pad.Pkcs7
        });        
        // 返回加密后的文本和IV(Base64格式),实际使用中可能需要安全地传输这些值
        return {          
          ciphertext: encrypted.toString(),          
            iv: iv.toString(CryptoJS.enc.Base64)
        };
    }    
    const secretKey = 'helloworldhelloworldhelloworld11'; /
    / 确保密钥是32个字符长(256位)
    const text = 'Hello, javaboy!';    
    const result = encryptAES(text, secretKey);    
    console.log(result);
    </script>
    </body>
    </html>


شيفرة الواجهة الخلفية:

import javax.crypto.Cipher;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.SecretKeySpec;import java.util.Base64;public class AESDecrypt {    public static String decryptAES(String encryptedData, String secretKey, String iv) throws Exception {        IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));        SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);        byte[] decodedValue = Base64.getDecoder().decode(encryptedData);        byte[] decryptedValue = cipher.doFinal(decodedValue);        return new String(decryptedValue, "UTF-8");
    }    public static void main(String[] args) {        try {            //前端加密后的文本
            String encryptedText = "PYANpAjMsRnBIEhovtEXQw==";            String secretKey = "helloworldhelloworldhelloworld11";            //前端 IV,要和加密后的文本一起传到后端
            String iv = "y/jUHcgSOpOiyNlsfjNUBg==";            String decryptedText = decryptAES(encryptedText, secretKey, iv);
            System.out.println("解密文本: " + decryptedText);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

انتبه إلى أن التشفير في الواجهة الأمامية هنا يولّد المعامل iv، ويجب إرساله إلى الواجهة الخلفية مع ناتج التشفير في الواجهة الأمامية.

التشفير في الواجهة الخلفية وفك التشفير في الواجهة الأمامية

عند إجراء تشفير AES في Java وفكّه في JavaScript، يجب كذلك التأكد من استخدام الطرفين المفتاح نفسه، ونمط الخوارزمية نفسه(مثل CBC وECB وغيرهما)、ونمط الحشو نفسه(مثل PKCS5Padding وPKCS7Padding وغيرهما)、وكذلك(إن كان ذلك منطبقًا)متجه التهيئة نفسه(IV).

شيفرة الواجهة الخلفية:

public class AESEncrypt {    public static String encryptAES(String plainText, String secretKey, String iv) throws Exception {        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(256); // 对于AES-256
        SecretKey secret = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES");        IvParameterSpec ivParameterSpec = new IvParameterSpec(Base64.getDecoder().decode(iv));        Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, secret, ivParameterSpec);        byte[] encrypted = cipher.doFinal(plainText.getBytes("UTF-8"));        return Base64.getEncoder().encodeToString(encrypted);
    }    public static void main(String[] args) {        try {            String plainText = "Hello, 江南一点雨!";            String secretKey = "helloworldhelloworldhelloworld11"; // 确保密钥是32个字符长(256位)
            String iv = Base64.getEncoder().encodeToString(new byte[16]); // 示例IV,实际应用中应更安全地生成

            String encryptedText = encryptAES(plainText, secretKey, iv);
            System.out.println("Encrypted text: " + encryptedText);
            System.out.println("IV (Base64): " + iv); // 确保将IV发送给解密方

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

شيفرة الواجهة الأمامية:

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js"></script>
    <script>
        function decryptAES(ciphertext, secretKey, iv) {            const key = CryptoJS.enc.Utf8.parse(secretKey);            const ivParsed = CryptoJS.enc.Base64.parse(iv);            const decrypted = CryptoJS.AES.decrypt(
                {                    ciphertext: CryptoJS.enc.Base64.parse(ciphertext)
                },
                key,
                {                    iv: ivParsed,                    mode: CryptoJS.mode.CBC,                    padding: CryptoJS.pad.Pkcs7
                }
            );            return decrypted.toString(CryptoJS.enc.Utf8);
        }        const secretKey = 'helloworldhelloworldhelloworld11';        const iv = 'AAAAAAAAAAAAAAAAAAAAAA=='; // 从Java代码获取
        const ciphertext = '1lPNVF1injas78KUWeKp5FusEr6f0pGgcrLAg9ELFr8='; // 从Java代码获取

        const decryptedText = decryptAES(ciphertext, secretKey, iv);        console.log(decryptedText);    </script></head><body></body></html>

اختبرتُ شخصيًا، أنا سونغ، أكواد التشفير وفك التشفير المذكورة أعلاه لتبادل البيانات بين الواجهة الأمامية والخلفية، وكانت جميعها تعمل دون مشكلة. إن احتجتم إلى ذلك، فتذكروا حفظ هذه المقالة في المفضلة لتكون مرجعًا لكم.

ثانيًا التشفير غير المتماثل

2.1 ما التشفير غير المتماثل

التشفير غير المتماثل، المعروف أيضًا بتشفير المفتاح العام، هو أسلوب تشفير يستخدم مفتاحين مختلفين(مفتاحًا عامًا ومفتاحًا خاصًا).

بوجه عام، يتميز التشفير غير المتماثل بالخصائص المختلفة التالية:

  1. المفتاح العام والمفتاح الخاص

  • توليد المفتاح العام والمفتاح الخاص:يستخدم التشفير غير المتماثل زوجًا من المفاتيح، يكون المفتاح العام متاحًا للجميع ويمكن لأي شخص الوصول إليه، بينما يبقى المفتاح الخاص سريًا ولا يستطيع الوصول إليه سوى حامله. يُولَّد هذان المفتاحان بخوارزمية رياضية، وهما مترابطان، لكن لا يمكن اشتقاق أحدهما من الآخر.

  1. مستوى أمان مرتفع

  • صعوبة الكسر:بفضل العلاقة الرياضية المعقّدة بين المفتاح العام والمفتاح الخاص، يوفّر التشفير غير المتماثل مستوى أمان مرتفعًا نسبيًا. ويصعب على المهاجم استنتاج المفتاح الخاص من المفتاح العام، مما يضمن أمان البيانات المشفّرة.

  • مقاومة هجمات الحوسبة الكمومية: بدأت بعض مشاريع البلوك تشين باستخدام خوارزميات تشفير مقاومة لهجمات الحوسبة الكمومية، مثل المتغيرات الآمنة كموميًا لخوارزمية التوقيع الرقمي بالمنحنيات الإهليلجية (ECDSA)، لمواجهة تهديد الحوسبة الكمومية مستقبلًا.

  1. سهولة توزيع المفتاح العام

  • علنية المفتاح العام:يمكن إتاحة المفتاح العام لأي شخص، ولذلك يسهل توزيعه كثيرًا. ويمكن لأي شخص استخدامه لتشفير البيانات، لكن صاحب المفتاح الخاص وحده يستطيع فك تشفيرها.

  1. التحقق من الهوية والتوقيعات الرقمية

  • التحقق من الهوية: يمكن استخدام المفتاح العام معرّفًا لهوية المستخدم، ويستطيع الآخرون التحقق من هويته دون معرفة مفتاحه الخاص. يساعد ذلك على إنشاء هويات موثوقة في الشبكات اللامركزية مثل سلاسل الكتل.

  • التوقيع الرقمي: يستطيع صاحب المفتاح الخاص توقيع الرسائل باستخدامه، ويمكن للآخرين التحقق من صحة التوقيع باستخدام المفتاح العام. وهذا يضمن سلامة الرسالة وموثوقية مصدرها.

  1. الاتصال الآمن

  • الاتصالات المشفّرة: يمكن استخدام المفتاح العام لتشفير الرسائل، ولا يستطيع فك تشفيرها إلا من يمتلك المفتاح الخاص المقابل. وهذا يضمن أمن البيانات أثناء الاتصال، ويمنع الأشخاص غير المخوّلين من الوصول إلى المعلومات.

  1. التحكّم في الأصول الرقمية

  • عنوان سلسلة الكتل والمفتاح الخاص: يُشتق عنوان سلسلة الكتل عادةً من المفتاح العام، ويتحكم المستخدم عبر المفتاح الخاص في الأصول الرقمية المرتبطة بذلك العنوان. وأمان المفتاح الخاص بالغ الأهمية لأمان الأصول الرقمية.

  1. سرعة التشفير وفك التشفير

  • أبطأ نسبيًا: التشفير وفك التشفير غير المتماثلين أبطأ بكثير من نظيريهما المتماثلين، لأنهما يتطلبان حسابات رياضية أكثر تعقيدًا. ومع ذلك، لا يؤثر ذلك في استخدامهما في مجالات مثل الاتصالات الآمنة والتحقق من الهوية.

2.2 استخدامات التشفير غير المتماثل

للتشفير غير المتماثل حالتا استخدام كلاسيكيتان.

  1. التشفير:هذا هو الاستخدام الأكثر شيوعًا لدينا، أي التشفير بالمفتاح العام وفك التشفير بالمفتاح الخاص.

  2. التوقيع: نظرًا إلى أن الشبكة غير موثوقة وقد تتعرض البيانات للتلاعب أثناء نقلها، يمكن عندئذ استخدام المفتاحين العام والخاص بالاتجاه المعاكس؛ إذ تُوقَّع البيانات بالمفتاح الخاص، ويُتحقق من التوقيع بالمفتاح العام، لضمان أمن البيانات وسلامتها.

أما الاستخدام الثاني، فيعبّر عنه بعض الأصدقاء بأنه تشفير بالمفتاح الخاص وفك للتشفير بالمفتاح العام؛ وعلى أي حال، يعرف الجميع أنهم يقصدون الشيء نفسه.

رغم أن خوارزميات التشفير غير المتماثل يمكن نظريًا استخدامها لتشفير البيانات والتوقيعات الرقمية، فإن تعقيدها الحسابي المرتفع وانخفاض كفاءتها يشكلان العائق الرئيسي في التطبيق العملي.

مقارنة بخوارزميات التشفير المتماثل، تكون عمليات التشفير غير المتماثل أبطأ بعدة مراتب عشرية، مما يؤثر بشدة في قدرتها على معالجة كميات كبيرة من البيانات. كذلك، لارتباط عمليتي التشفير وفك التشفير ارتباطًا وثيقًا بطول المفتاح، وعدم دعم أنماط تشفير الكتل، فإنها لا تستطيع معالجة سوى قدر قليل من البيانات لا يتجاوز طول المفتاح، ولا يمكنها تشفير كميات كبيرة من البيانات.

للتغلب على قصور أداء التشفير غير المتماثل، تستخدم أنظمة التشفير الحديثة عادةً استراتيجية تشفير هجينة تجمع مزايا التشفير المتماثل وغير المتماثل. في هذه الاستراتيجية، يُستخدم التشفير غير المتماثل أساسًا لنقل مفتاح تشفير متماثل بأمان إلى الطرف الآخر (أي «التفاوض على المفتاح»). وبمجرد أن يتشارك الطرفان هذا المفتاح المتماثل بأمان، يمكن استخدام خوارزميات التشفير المتماثل عالية الكفاءة لتشفير كميات كبيرة من البيانات وفك تشفيرها. لا ترفع هذه الطريقة المشتركة كفاءة التشفير فحسب، بل تعزز أيضًا أمان الاتصالات، وتُستخدم على نطاق واسع في بروتوكولات الاتصال الآمن المختلفة، مثل SSL/TLS.

في مجال التوقيعات الرقمية، أُجريت أيضًا بعض التعديلات لتحسين كفاءة التشفير غير المتماثل. وتتمثل الطريقة في حساب ملخص للبيانات الأصلية أولًا (باستخدام MD5 أو SHA مثلًا)، للحصول على قيمة ملخص ثابتة الطول. ثم تُشفّر قيمة الملخص بخوارزمية تشفير غير متماثل لإنشاء توقيع رقمي. ولأن خوارزمية التلخيص تضغط البيانات مهما كان طولها بكفاءة إلى ملخص ثابت الطول، يبقى طول الملخص واحدًا مهما كبر حجم البيانات الأصلية، وتظل عملية التوقيع فعالة. وعند التحقق من التوقيع، يكفي إعادة حساب ملخص البيانات الأصلية ومقارنته بالتوقيع بعد فك تشفيره، لتحديد ما إذا كانت البيانات قد عُدلت بسرعة.

2.3 مثال على التشفير

مثال على التشفير وفك التشفير باستخدام RSA في شيفرة Java:

public class RsaDemo {    public static void main(String[] args) {        try {            KeyPair keyPair = generateRSAKeyPair();            PublicKey publicKey = keyPair.getPublic();            PrivateKey privateKey = keyPair.getPrivate();            String originalData = "Hello, 江南一点雨!";            String encryptedData = encrypt(publicKey, originalData);            String decryptedData = decrypt(privateKey, encryptedData);

            System.out.println("加密后的数据: " + encryptedData);
            System.out.println("解密后的数据: " + decryptedData);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }    public static String decrypt(PrivateKey privateKey, String encryptedData) throws Exception {        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);        byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData));        return new String(decryptedBytes);
    }    public static String encrypt(PublicKey publicKey, String data) throws Exception {        Cipher cipher = Cipher.getInstance("RSA");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);        byte[] bytes = cipher.doFinal(data.getBytes());        return Base64.getEncoder().encodeToString(bytes);
    }    public static KeyPair generateRSAKeyPair() throws NoSuchAlgorithmException {        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(2048); // 可以指定密钥长度,如2048位
        return keyGen.generateKeyPair();
    }
}

2.4 التكامل بين الواجهة الأمامية والواجهة الخلفية

التشفير في الواجهة الأمامية وفك التشفير في الواجهة الخلفية

شيفرة الواجهة الخلفية مطابقة للمثال السابق، والاختلاف هو أنه بعد الحصول على المفتاح العام، يمكننا طباعته، إذ سيُنقل هذا المفتاح العام لاحقًا إلى الواجهة الأمامية:

public static void main(String[] args) {    try {        KeyPair keyPair = generateRSAKeyPair();        PublicKey publicKey = keyPair.getPublic();        PrivateKey privateKey = keyPair.getPrivate();
        System.out.println("公钥: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));        String originalData = "Hello, 江南一点雨!";        String encryptedData = encrypt(publicKey, originalData);        String decryptedData = decrypt(privateKey, encryptedData);
        System.out.println("加密后的数据: " + encryptedData);
        System.out.println("解密后的数据: " + decryptedData);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

شيفرة الواجهة الأمامية كما يلي:

<!DOCTYPE html><html lang="en"><head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>RSA Encryption Example</title>
    <!-- 引入jsencrypt库 -->
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/bin/jsencrypt.min.js"></script></head><body><script>
    // 重写前端加密方法
    function encryptData(publicKey, data) {        // 创建一个新的JSEncrypt对象
        var encryptor = new JSEncrypt();        // 设置公钥
        encryptor.setPublicKey(publicKey);        // 加密数据
        var encrypted = encryptor.encrypt(data);        return encrypted;
    }    // 示例公钥(实际使用时应该替换为服务器提供的公钥)
    var publicKey = `MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAnP5FOXIghidLDE2FgFwzi4Y+qTdYjnc0eMoiL5i4gdOeTE+7Uu9YvDB51GcBWKD9lvmZr5rX8z0OBpwe526qsTekNpXoIVk9DB34US0HOrAXEEwpUTVuSR656cJGAwmWBkVaalQynEz4Dlzrm53zExVYueruYUuzFyuZDaQcFnl3rWUH/XDkCIe23z0R1TfT3Q2OYNKft0u56r0S/ko99utXuYJK9yowe7QGT6q4cSJwsITQTomCARAq9q+bSNuGEYa4FlYCKIKWIhKbMhz0FYIMB2fJN10GyZbbvKASqeMkuCoD2Efgd8/6uMwOaMcx9LgEkcFaQ3qgDutsPXNUswIDAQAB`;    // 要加密的数据
    var data = 'Hello, javaboy!';    // 调用加密方法
    var encryptedData = encryptData(publicKey, data);    // 输出加密后的数据
    console.log('Encrypted Data:', encryptedData);</script></body></html>

التشفير في الواجهة الخلفية وفك التشفير في الواجهة الأمامية

إن تشفير البيانات بخوارزمية RSA في Java ثم فك تشفيرها في JavaScript يعني أن الخادم يستخدم المفتاح العام للواجهة الأمامية للتشفير، وأن الواجهة الأمامية تستخدم مفتاحها الخاص لفك التشفير. وفي هذا السيناريو، يسهل جدًا سرقة المفتاح الخاص للواجهة الأمامية، لذا لا يُنصح بهذا الاستخدام. ولذلك لن أورد مثالًا عليه.

حسنًا، تحدثنا معًا مرة أخرى عن التشفير المتماثل وغير المتماثل. لقد اختبرتُ، أنا سونغ، جميع أمثلة الشيفرة أعلاه ونجحت، ويمكنكم الاسترشاد بها.


التعليقات

جارٍ الإرسال

اختر المظهر المفضل

يُطبّق المظهر على الموقع كله.