الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

RSA Implementation

مغلق
بدأه mesho_cs في 30 مارس 2006 · 9 رد · 1,758 مشاهدة · في Microsoft Visual C#.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم جميعا

احاول عمل برنامج للتشفير ولكنى مازلت فى البدايه

وبدأت بخوارزم الـ RSA

بالرغم من وجود name space خاص بالـ Security ويحتوى على implementation لهذا الخوارزم ولكن واجهتنى مشكله فى التعامل معه حيث ان Microsoft اخفت الكثير من الـ Functions فلم استطع فهم الـ implementation الجاهز وشكرا لـ Microsoft

وصححونى لو كنت غلطان

ففكرت فى عمل الـ Implementation من البدايه

فكره الخوارزم هى كالتالى :

1.	Generate two large random primes, p and q, of approximately equal size such that their product n = pq and p =! q .
2.	Compute n = pq and φ(n)= (p-1)(q-1). 
3.	Choose an integer e, 1 < e < φ(n), such that gcd(e, φ(n)) = 1.
4.	Compute the secret exponent d, 1 < d < φ(n), such that 
de ≡ 1 (mod φ(n)). 
5.	The public key is (n, e) and the private key is (n, d). The values of p, q, and φ(n) should also be kept secret. 
•	n is known as the modulus. 
•	e is known as the public exponent or encryption exponent. 
•	d is known as the secret exponent or decryption exponent.

وهذا ما وصلت اليه حتى الان

الخطوه رقم 1 هى اختيار عددين اوليين بشكل عشوائى :

Start:
            Random rnd = new Random();
            int x = 17;//rnd.Next(3, 100);
            int y = 11;//rnd.Next(3, 100);
            #endregion
            /*********************************************************/
           // Validating if the numbers are primes
            
            for (int i = 2; i < x; i++)
            {
                if (x % i == 0)
                {
                    goto Start;
                }
            }

            for (int j = 2; j < y; j++)
            {
                if (y % j == 0)
                {
                    goto Start;
                }
            }
// Validating that P!=Q and display the numbers
            if (x != y)
            {
                Console.WriteLine("P = " + x);
                Console.WriteLine("Q = " + y);
            }
            else
                goto Start;

الخطوه رقم 2 هى مجرد حسابات بسيطه .

فى الخطوه رقم 3 جربت اختيار الـ e بحيث تكون Prime لفشلى فى عمل كود للـ GCD

// Calculate e : 1 < e < phi(n)
            Start2:
            Random rnd2 = new Random();
            int e = 7;// rnd2.Next(n2);
            for (int i = 2; i < e; i++)
            {
                if (e % i == 0 )
                {
                    goto Start2;
                }
                if (e == x && e == y)
                {
                    goto Start2;
                }
            }
            Console.WriteLine("-------------------------");
            Console.WriteLine("e = "+e);

والخطوه رقم 4 :

//Compute d : de = 1 (mod phi(n))
            // d = (K*phi(n)+1) / e
            int d;
            for (int k = 1;;k++ )
            {
                int l = (k * (n2 + 1))%e;
                
                if (l == 0)
                {
                    d = (k * (n2 + 1)) / e;
                    break;
                }
                else
                    k++;
            }
            Console.WriteLine("d = " + d);
            Console.WriteLine("");
            Console.WriteLine("The Public  key is :(" + e + "," + n + ")");
            Console.WriteLine("The Private key is :(" + d + "," + n + ")");
            Console.WriteLine("-------------------------");

بقى الان عمل الـ Encryption & Decryption

وهنا المشكله الكبيره

تم اتخاذ قيم لـ P = 17,Q = 11,e = 7

لمعرفه مكان المشكله ووجدت فى الـ Encryption

//Encryption & Decryption
            Console.WriteLine("Enter messege to Encrypt");
            string s1 = Console.ReadLine();
            int m =int.Parse(s1);
            int c = m ^ e% n;
             
            Console.WriteLine("The Cipher is : " + c);
            Console.WriteLine("To decrypt press Enter");
            Console.ReadLine();
            m = (c ^ d)% n;
            
            Console.WriteLine("The Plain messege is : "+m);

باستخدام القيم الـ P = 17,Q = 11,e = 7

ستكون النتيجه n = 187,phi n = 160 , d= 23

عند تشفير رقم 88 مثلا وهذا مثال موجود فى كتاب عندى

سيكون ناتج التشفير 11

ولكن مش دى النتيجه اللى بتظهر فى الكود ده :wacko:

يارييت تساعدوونى يا شباب و ادعولى اقدر اكمل المشروع ده :^)

#2

مش معقول 23 واحد شافو الموضوع و محدش عرف يساعدنى

هوه الموضوع انا عارف انه صعب بس مش اوى كده

ياريت تشوفولى حل

#3

تتبع البرامج ليست سهلة :wacko:

حاول أن تعمل break points

دبر حالك :D

#4

السلام عليكم

انا في مشروع تخرجي (Steganography) وقد استعملت التشفسر واستعملت RSA وعملت لها implementation

اقتباس
uint enc (byte t, uint ee, uint pq)

  {

   uint x = 1;

   for(int i=0; i<ee; i++)

   {

    x = (x * t) % pq;

   }

   return x;

  }

  byte dec (uint c, uint d, uint pq)

  {

   uint x = 1;

   for(int i=0; i<d; i++)

   {

    x = (x * c) % pq;

   }

   return (byte)x;

  }

اخي انتبه انه اذا انت شفرت byte لازم ترجع بعد عملية التشفير byte

اذا لاحظت انا عملت لووب loop وفي كل مرة اخذ باقي القسمة وذلك لأن

اذا لم اعمل هكذا فالرقم الناتج من عملي الرفع للأس سيكون كبير جدا ولا يسعه لا double و اي data type فلذلك كل ما اضرب مرة اخذ باقي القسمة وهي طريقة صحيحة مثبته رياضيا.

اما الارقام:

اقتباس
uint p = 257;

uint q = 251;

uint pq = p * q;

e=113;

d=44177;

وطبعا كما هو معروف ممكن ان يكون اكثر من قيمة ل d .

طبعا كن على علم ان ناتج التشفير سينتج رقم اكبر من byte . مثلا عندي انا uint حاول عمل لووب لكل الاسكي وشوف اكبر رقم ينتج من عملية التشفير واحجز الحجم المناسب له، هذا القوى تعتبر 16بت لأن كل بايت يشفر ب 16 بت وبالتالي حجم الملف سيتضاعف.

اي استفسار انا جاهز

تم تعديل هذه المشاركة بواسطة m_lahlouh في 1 أبريل 2006 في 09:29

عندما تولد يا ابن آدم يؤذن في اذنك من غير صلاة...

وعندما تموت.... يصلى عليك من غير آذان....

فكأن حياتك في الدنيا ليست سوى... الوقت الذي تمضيه بين الأذان والصلاة...

فلا تقضيه بما لاينفع

Mohammad Lahlouh

mohammadlahlouh.blogspot.com

Make money from your Website or Blog with BidVertiser

#5
m_lahlouh كتب:
السلام عليكم

اخي انتبه انه اذا انت شفرت byte لازم ترجع بعد عملية التشفير byte

اذا لاحظت انا عملت لووب loop  وفي كل مرة اخذ باقي القسمة وذلك لأن

اذا لم اعمل هكذا فالرقم الناتج من عملي الرفع للأس سيكون كبير جدا ولا يسعه لا double و اي data type فلذلك كل ما اضرب مرة اخذ باقي القسمة وهي طريقة صحيحة مثبته رياضيا.

اما الارقام:

وطبعا كما هو معروف ممكن ان يكون اكثر من قيمة ل d .

كلام سليم 100%

بخصوص الـ GCD موضوعه سهل, افرض عندك 3 متحولات, e, i, واخر مساعد x

تكون الخوارزمية

    int e = Int32.Parse(e);
    int i = Int32.Parse(i);
    int x=1;;
    while (x!=0)
    {
    x = e % i;
    e = i;
    i = x;
    }

e و i هي الارقام التي تريد الحصول على الـ GCD لها (الكود قد يحتاج بعض التعديلات لانه خاص بـ #C .. الـ % تحول الى Mod.. بخصوص تعريف المتحولات اعتقد تحتاج DIM)

المهم يتم الخروج من الحلقة عندما يكون الباقي x مساوي للصفر, تستطيع عندها استخدام i لانه الـ GCD

تم تعديل هذه المشاركة بواسطة Xacker في 1 أبريل 2006 في 12:38

Do as I say, not as I do

We are Anonymous. We are Legion. We don't forgive. We don't forget

#6

اشكركم على تفاعلكم معى جميعا و اخيرا وجدت المشكله

فى الكود الاول عند بدأ التشفير كان : int c = m ^ e% n;

الخطأ فى انى كنت باستخدم الـ operator "^" على انه الـ pow او الاس ولكن اكتشفت ان فى الـ c# معناه XOR

:wacko:

وبعد التعديل ده الكود الجديد

Double enc = Math.Pow(m, e) % n;
            Double dec = Math.Pow(enc, d) % n;

بدلا من

int c = m ^ e% n;

ولكن ظهرت مشكله اخرى :

عند تشفير الرقم 88 كما فى المثال يصبح الناتج 11 كده صح

لكن عند فك التشفير يجب رفع الرقم 11 للاس 23 والرقم هنا هايكون كبيير اوى زى ما قال الاخ Xacker وبالفعل قيمته اكبر من الـ double ولذلك ناتج فك التشفير يكون خاطىء

فكرت فى تحويل الـ Input للاسكى ومازال البحث جارى

وشكرا مره تانيه على تعاونكم معى

#7
m_lahlouh كتب:
اذا لاحظت انا عملت لووب loop  وفي كل مرة اخذ باقي القسمة وذلك لأن

اذا لم اعمل هكذا فالرقم الناتج من عملي الرفع للأس سيكون كبير جدا ولا يسعه لا double و اي data type فلذلك كل ما اضرب مرة اخذ باقي القسمة وهي طريقة صحيحة مثبته رياضيا.

تحل مشكلة الرقم الكبير بعمل loop لا حظ الكود السابق اخي

عندما تولد يا ابن آدم يؤذن في اذنك من غير صلاة...

وعندما تموت.... يصلى عليك من غير آذان....

فكأن حياتك في الدنيا ليست سوى... الوقت الذي تمضيه بين الأذان والصلاة...

فلا تقضيه بما لاينفع

Mohammad Lahlouh

mohammadlahlouh.blogspot.com

Make money from your Website or Blog with BidVertiser

#8

عملت الـ Loop ومازال نفس الخطأ كل مره

            Double enc = 0;
            Double dec = 0;

            for(int i=0; i<e; i++)
            {
                 enc = Math.Pow(m, e) % n;
            }

            for(int i=0; i<d; i++)
            {
                dec = Math.Pow(enc, d) % n;
            }

بس اكييد ليها حل يمكن انا مش عارف استخدم الـ Loop

#9

السلام عليكم

نعم الخطأ

انت شفرت متغير من نوع double وخزنته في متغير من نوع double ايضا !!!!! هنا الخطأ

ما اثباتك انه اذا شفرت double سينتج double??

اخي في مشاركتي السابقة انا شفرت byte ونتج uint!!!!

لو حاولنا تشفير الرقم 100، ورفعناه للأس 113 فسيكون الناتج؟ =( واحد ضرب 10 للأس 226) في الآلة الحاسبة العلمية، اصلا هذا الرقم مقرب!!

فما بالك اذا خزنا مثل هذا الرقم في متغير من نوع double??????

جرب ان تحسب 100 للأس 44177!؟؟َ!

تتبع البرنامج تعليمة تعليمة واحسب معه ولاحظ اين يتم الخطأ(debug).

عندما تولد يا ابن آدم يؤذن في اذنك من غير صلاة...

وعندما تموت.... يصلى عليك من غير آذان....

فكأن حياتك في الدنيا ليست سوى... الوقت الذي تمضيه بين الأذان والصلاة...

فلا تقضيه بما لاينفع

Mohammad Lahlouh

mohammadlahlouh.blogspot.com

Make money from your Website or Blog with BidVertiser

#10

جرب هذا الألغوريثم ( لحساب ال exponentation ) :

Input: n, e, m
Output: c = m^e mod n
var: m, e, n, c : integer
begin
          c = 1;
          while ( e != 0 )
          {
                      while( e mod 2 ==0)
                      {
                                 e = e/2;      //integer division
                                 m = (m*m) mod n
                       }
                     e = e-1;
                     c = (c*m) mod n;
          }
        return (c);
end

تم تعديل هذه المشاركة بواسطة baha_ashour في 10 أبريل 2006 في 16:38

هذا الموضوع مغلق.

مواضيع مشابهة