سؤال

أنا جديد في التشفير. أحتاج إلى تنفيذ خوارزمية التشفير غير المتماثلة، والتي أعتقد أنها تستخدم المفتاح الخاص / العام. بدأت في استخدام عينة من rsacryptoserviceProvider. كان على ما يرام مع البيانات الصغيرة للتشفير. ولكن عند استخدامه في بيانات أكبر نسبيا "خطوط 2"، أحصل على استثناء CryptographiceXception "طول سيء"!

//Create a new instance of RSACryptoServiceProvider.
using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
{

    //Import the RSA Key information. This only needs
    //toinclude the public key information.
    //RSA.ImportParameters(RSAKeyInfo);
    byte[] keyValue = Convert.FromBase64String(publicKey);
    RSA.ImportCspBlob(keyValue);

    //Encrypt the passed byte array and specify OAEP padding.  
    //OAEP padding is only available on Microsoft Windows XP or
    //later.  
    encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding);
}

ثم وجدت بعض العينات من تشفير البيانات الكبيرة (أو الملفات) باستخدام CryptoStream، واستخدام الخوارزميات المتماثلة فقط مثل DES أو 3DES، والتي لها وظيفة CreateNcryptor لإرجاع ICRYPTOTRANSFORM كواحد من المدخلات إلى منشئ CryptoStream !!!

CryptoStream cStream = new CryptoStream(fStream,
                new TripleDESCryptoServiceProvider().CreateEncryptor(Key, IV),
                CryptoStreamMode.Write);

ما هي طريقة تشفير الملفات باستخدام RSA؟

هل كانت مفيدة؟

المحلول

كما ذكر في إجابات أخرى يتم تصميم تشفير غير متماثل فقط لتشفير البيانات أصغر من حجم المفتاح.

أحد الخيارات التي قمت بتنفيذها عند الحاجة إلى تحويل كميات كبيرة من البيانات المشفرة بين أنظمة اثنين هي الحصول على لوحة مفاتيح RSA التي يعرف مفتاحها العام لكل من المرسل والمستقبل ثم عندما تحتاج البيانات إلى إرسال جهاز الاستقبال الذي ينشئ مفاتيح RSA جديدة ، تشفير المفتاح العمومي لهذا keypair مع المفتاح العام المشترك ويرسل المفتاح العام المشفهر إلى المرسل. يقوم المرسل بفكشف المفتاح العمومي على أجهزة الاستقبال باستخدام المفتاح الخاص (الذي لا يحتاج جهاز الاستقبال إليه، تماما كما لا يحتاج المرسل إلى معرفة المفتاح الخاص بجهاز الاستقبال الذي تم إنشاؤه)، ويولد مفتاح تشفير متماثل، وتشفير البيانات باستخدام المفتاح المتماثل ثم يقوم بتشفير المفتاح المتماثل باستخدام المفتاح العمومي المستلم من جهاز الاستقبال. ثم يتم إرسال كل من المفتاح المتماثل المشفر والبيانات المشفرة إلى المتلقي الذي يستخدم المفتاح الخاص الناتج عن فك تشفير المفتاح المتماثل ثم فك تشفير البيانات.

يمكنك استعمال ال RSACryptoServiceProvider.ToXMLString() و RSACryptoServiceProvider.FromXMLString() طرق لتخزين المفتاح العمومي المشترك كسلسلة XML حرفية في تطبيق الاستقبال.

لا تنسى، عند إنشاء مفتاح التشفير المتماثل للاستخدام RNGCryptoServiceProvider() لتوليد المفتاح لأنها طريقة أكثر أمانا لتوليد أرقام عشوائية (Pseudo).

أيضا، أوصي بشدة باستخدام 3DES كجوارخ التشفير المتماثلة، فهو قديم وبدأ في إظهار عمره. استخدام تشفير AES متماثل مع إما AesCryptoServiceProvicer أو RijndaelManaged الطبقات.

نصائح أخرى

يمكن ل RSA فقط تشفير كتل البيانات التي تقصر من طول المفتاح حتى ما تفعله عادة

  1. إنشاء مفتاح عشوائي للطول الصحيح المطلوب ل AES (أو ما شابه).
  2. تشفير البيانات الخاصة بك باستخدام AES أو مماثلة باستخدام هذا المفتاح
  3. تشفير المفتاح العشوائي باستخدام مفتاح RSA الخاص بك

ثم نشر كل من المخرجات من 2 و 3

فك تشفير

  1. فك تشفير مفتاح AES باستخدام مفتاح RSA الخاص بك.
  2. فك تشفير البيانات باستخدام مفتاح AES

عادة ما يتم استخدام RSA فقط لنقل مفتاح متماثل (في بداية الدفق على سبيل المثال)، ثم يتم تشفير البيانات السائبة بهذا المفتاح.

التشفير غير المتماثل ليس فعالا بما يكفي لنقل الكثير من البيانات.

للحصول على عمليات البحث المستقبلية فيما يتعلق باستثناءات RSA السيئة ...

يمكنك حساب عدد الأقصى لعدد البايتات التي يمكن تشفيرها بحجم مفتاح معين مع ما يلي:

((Keysize - 384) / 8) + 37

ومع ذلك، إذا كان المعلمة الحشوة المثلى غير المتماثلة غير المتماثلة (OAEP) صحيحة، يمكن استخدام ما يلي لحساب ماكس بايت:

((keysize - 384) / 8) + 7

الأحجام الرئيسية القانونية هي 384 من خلال 16384 بحجم تخطي 8.

لا تدعم تطبيقات .NET من RSA (وجميع الخوارزميات الرئيسية العامة / الخاصة) كتلا كبيرة من البيانات - لأن هذا ليس هو الهدف من المفتاح العام / الخاص.

بدلا من ذلك، تقوم بتوليد مفتاح جديد متماثل واستخدام ذلك لتشفير البيانات. ثم تستخدم المفتاح العام / الخاص لتشفير المفتاح المتماثل وتبادله مع الطرف الآخر بشكل آمن. ثم فك تشفير المفتاح المتماثل واستخدامه لإلغاء بياناتك.

نملك:

MaxBlockSize=((KeySize - 384) / 8) + 37

أو

MaxBlockSize=((KeySize - 384) / 8) + 7

لذلك، يمكننا تقسيم البيانات إلى بعض الكتل ثم تشفير كل واحد ثم دمجها

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top