الگوریتم RSA+عیدانه+تقویم ۸۶

 بر چهره گل نسيم نوروز خوش است  

                در صحن چمن روي دلفروز خوش است 

از دي که گذشت هر چه گويي خوش نيست  

                خوش باش و ز دي مگو که امروز خوش است 

فرا رسیدن سال نو و بهار طبیعت مبارک

انشاءالله سالی پر از خیر و برکت داشته باشید.

از همه دوستان می خواهم که موقع سال تحویل همه مریض ها را مخصوصا بچه هایی  که عید رو توی بیمارستان می گذرانند دعا کنید راستش این دعا رو ازتون به این دلیل می خواهم که پارسال در ایام نوروز توی بیمارستان بخاطر یکی از اقوام عیدی نداشتم و حالا بهتر این موضوع رو درک می کنم . اگر در سال گذشته از دست ما رنجیده خاطر شدید ما رو به بزرگی خودتون ببخشید .

راستی آخرین پروژه مشترک من و آقا شهریار هم که در زمینه تحقیق در عملیات است از لینک زیر قابل دریافت است.

برنامه ریزی نیمه معین

و در انتها تقویم ۸۶ از دوست عزیزم آقا تایماز

تقویم سال ۱۳۸۶


{فرما در حاشیه  نسخه رونوشتش از  Diophantus' Arithmetica می نویسد }

برای تقسیم کردن یک عدد مکعب کامل به دو مکعب دیگر ، توان 4  و در حالت کلی هر توانی از هر عددی به دو توان هم جنس همانطور که ذکر شد حالت دومی نیز ممکن است ، و من مطمئنا یک اثبات تحسین بر انگیز برای آن پیدا کرده ام ، اما حاشیه کتاب برای نوشتن آن بسیار باریک است!!!!!!
پیر فرما

در ابتدای این سلسله مقالات به بیان مفهوم کلید عمومی و شیوه رمز نگاری نا متقارن پرداختیم سپس در ادامه روش های تایید هویت  که مکمل این شیوه است مورد بررسی قرار گرفت و پس از آن از ایده اولیه الگوریتم آر اس ای  -که نوعی روش به رمز در آوردن اطلاعات مبتنی بر شیوه کلید عمومی است- صحبت شد و حالا در ادامه  مثال کاملی را برای بیان الگوریتم RSA مطرح می کنیم .در اینجا سعی شده تا از اعداد اول بسیار کوچکی استفاده شود تا ادامه روند محاسبات ساده باشد اما باید توجه داشت که در کاربرد واقعی روش RSA  این اعداد باید بسیار بزرگ ،حداقل دارای 100 رقم ، انتخاب می شود:

در طول این مثال فرض کنید شخص A می خواهد یک کلید عمومی برای خود بسازد و  شخص B می خواهد با استفاده از این کلید عمومی برای A پیغامی بفرستد. فرض می کنیم که A و B بر سر روشی برای برمز در آوردن متن بصورت اعداد توافق کرده اند .بنابراین این گام ها باید پیموده شود :

1. ابتدا شخص A دو عدد اول انتخاب می کند . ما از اعداد p=23 و q=41 استفاده می کنیم .

2. شخص A دو عدد p و q را در هم ضرب میکند تا به N=p.q=(23)(41)=934 برسد . 934 کلید عمومی او است ، که آنرا به نفر B می دهد ( و همچنین به باقی افرادی در جهان که متمایل باشد )

3. شخص A همچنین عدد دیگری چون e را که نسبت به (M=(p-1)(q-1 اول باشد. یعنی بزرگترین مقسوم علیه مشترک آنها یک باشد یا p-1)(q-1),e)=1)). در این مورد خاص M=(p-1)(q-1)=(22)(40)=880 بنابراین e=7 مناسب است. e نیز قسمتی از کلید عمومی است و باید علاوه بر p.q ، e نیز به شخص B گفته شود.

4. حالا B اطلاعات کافی برای برمز در آوردن یک پیغام برای A را دارد . فرض کنید که در این مثال پیغامی مورد نظر عدد P=35 باشد .

5. شخص B  مقدار(C=Pe(mod N)=357(mod 943 را حساب می کند.

۶.5357=6433929687 و ۵64339296875(mod 943)=545 

عدد  545در واقع پیغام رمزگذاری شده ای است که B به A می فرستد.

7. حالا A می خواهد 545 را رمزگشایی کند برای این کار او عددی را چون d نیاز دارد طوری که((ed=1(mod (p-1)(q-1 ، یا در این مثال(7d=1(mod 880جواب فرد A برای d عدد 503 خواهد بود ، زیرا داریم(7x503=3521=(4x(880)+1)(mod 800.

8. برای پیدا کردن متن رمزگشایی شده ، A مجبور است

(Cd (mod N)=545503 (mod 943

را حساب کند. در ابتدا به نظر می آید که این کار بسیار دشوار است اما توجه کنید

503 = 256+128+64+32+16+4+2+1

(که در واقع بسط دودویی عدد 503 است ) بنابر این خواهیم داشت

545503 = 545256+128+64+32+16+4+2+1 = 545256545128 … 5451

اما از آنجا که ما تنها علاقمند به پیدا کردن باقی مانده به پیمانه 943 هستیم ، می توانیم با محاسبه باقیمانده تمام عامل های ضربی در این پیمانه به مقصودمان برسیم و این کار را می توانیم با به توان 2 رساندن های متوالی عدد 545 انجام دهیم زیرا تمام توان های عامل های ضربی ، مضربی از 2 هستند.
به عنوان مثال برای اینکه به باقی مانده  توان 4 ام عدد 545 برسیم داریم :

5452(mod 943) = 545 . 545 = 297025(mod 943) = 923

با به توان 2 رساندن مجدد داریم :

5454(mod 943) =(5452)2(mod 943) = 923 . 923 = 851929(mod 943) = 400

و به همین ترتیب برای توان های بالا تر عمل می کنیم و در نهایت به نتایج زیر می رسیم :

5451(mod 943) = 545

5452(mod 943) = 923

5454(mod 943) = 400

5458(mod 943) = 633

54516(mod 943) = 857

54532(mod 943) = 795

54564(mod 943) = 215

545128(mod 943) = 18

545256(mod 943) = 324

بنابراین عدد مورد نظر ما به صورت زیر بدست می آید :

545503(mod 943) = 324 . 18 . 215. 795. 857. 400. 923. 545(mod 943) = 35

بوسیله چنین عملیات کسالت آوری ( البته برای رایانه این محاسبات کاملا ساده و دارای سخت افزار راحتی است ) شخص A می تواند پیام B را رمزگشایی کند و  به پیام اصلی یعنی P=35 برسد.

خوب اگر می خواهید با هم یک دور دیگه الگوریتم را مرور کنیم  مثال ساده تر زیر را در نظر  بگیرید :


ابتدا دو اول پیدا میکنیم :

p = 7
q = 19

 تعیین مقدار N:

N=7x19=133

تعیین مقدار M:

M=(7-1)X(19-1)=108

انتخاب عدد کوچک e که نسبت به M اول باشد :

e = 2 => gcd(e, 108) = 2 (غ.ق.ق)
e = 3 => gcd(e, 108) = 3 (غ.ق.ق)
e = 4 => gcd(e, 108) = 4 (غ.ق.ق)
e = 5 => gcd(e, 108) = 1 (ق.ق)

gcd : greatest common divisor

ب.م.م بزرگترین مقسوم علیه مشترک

انتخاب d طوریکه((ed=1 (mod (p-1)(q-1 یا  de % M = 1

 ed=1(mod (p-1)(q-1))   =>   ed=1(mod  M)   =>    

= > de % M = 1   =>     de = 1 + nM

=>  d = (1 +nM) / e

 

n = 0 => d = 1 / 5 (غ.ق.ق)
n = 1 => d = 109 / 5 (غ.ق.ق)
n = 2 => d = 217 / 5 (غ.ق.ق)
n = 3 => d = 325 / 5 = 65 (ق.ق)

رمزگذاری متن(عدد) p=6:

C = Pe % n
  = 65 % 133
  = 7776 % 133
  = 62

رمزگشایی متن رمز گذاری شده C=62:

P = Cd % n
  = 6265 % 133
  = 62 * 6264 % 133
  = 62 * (622)32 % 133
  = 62 * 384432 % 133
  = 62 * (3844 % 133)32 % 133
  = 62 * 12032 % 133

با ادامه کاهش توان به روش فوق که توان عبارت 6265  به 12032 کاهش داد و در واقع همان روش فوق یعنی تجزیه توان به جمعوند هایی که توان های 2 هستند ولی این بار در جهت عکس حرکت می کنیم یعنی از جمعوند آخری داریم :

= 62 * 3616 % 133
  = 62 * 998 % 133
  = 62 * 924 % 133
  = 62 * 852 % 133
  = 62 * 43 % 133
  = 2666 % 133
  = 6


که با متن اولیه p=6 مطابق است . بنابراین الگوریتم RSA درست کار می کند !

تمرین

حالا برای تمرین فرض کنید شما شخص ، A  هستید و عدد های  p=97 و q=173 را بعنوان عدد های اول و همچنین عدد e را 5 انتخاب کرده اید . بنابراین شما عدد N=16781 ( که همان حاصل p.q ) و e=5 را در اختیار فرد B می گذارید .
او متنی را(یک عدد) برای شما رمزگذاری  می کند و برای شما عدد رمزگذاری شده 5347 را می فرستد . خوب حالا ببینید می توانید عدد اصلی را رمز گشایی کنید .

کلید واژه ها :الگوریتم رمزنگاری آر اس ای  RSA Encryption Algorithm  متن رمزگشایی شده (متن اصلی) Plaintext  متن رمزگذاری شده Ciphertext

مروری بر رمزنگاری RSA

 شاید بتوان یک ریاضیدان را با یک طراح لباس مقایسه کرد ، کسی که کاملا بی توجه و نا آگاه از مخلوقی است که از این لباس استفاده می کند ، یقینا هنر او از نیاز برای پوشاند مخلوقات سر چشمه می گیرد ، اما روز طراحی لباس مدت زیادی پیش تر از روزی است که قواره و اندامی به تصادف پیدا می شود تا با این لباس هماهنگ باشد، البته زمانیکه آن لباس در گذشته طراحی شده باشد. بنابراین برای غافلگیر شدن و لذت بردن از این اتفاقات پایانی نیست.
جرج بی دانتزیک

در مطالب گذشته مفهوم رمزنگاری یکطرفه با همان سیستم کلید عمومی توضیح داده شد یک از معروفترین مدل های این روش، RSA است حروف RSA ابتدای نام سه پدید آورنده آن است:

 Ronald Rivest, Adi Shamir ,Leonard Adleman.

 

از چپ به راست Leonard Adleman، Ronald Rivest، Adi Shamir کار های اولیه بر روی RSA به زمان دانشجوی آنها در MIT بر میگردد.

این روش بر پایه ایده ای به ظاهر ساده ولی زیرکانه است که در زیر مطرح می شود:

ضرب اعداد خیلی ساده است بویژه با استفاده از رایانه ،  ولی تجزیه اعداد بسیار مشکل است. مثلا اگر بخواهیم بدانیم که حاصلضرب 34537 در 99991 چقدر می شود براحتی با وارد کردن این اعداد در ماشین حساب به عدد 3453389167 میرسیم اما عکس این عمل بسیار سخت تر است.

اگر  عدد 14459160519 را به شما داده باشند و گفته باشند که این عدد با ضرب دو عدد صحیح به دست آمده است.آیا می توانید این دو عدد را تعیین کنید.این سوال نسبتا سخت است انصافاٌ رایانه این عدد را به سرعت تجزیه میکند (البته در این کار از لم های خاصی استفاده می شود ) ، اساسا این کار با امتحان کردن تعداد زیادی ترکیب احتمالی صورت می گیرد.رایانه برای اینکه هر عدد ، با هر اندازه ای ، را تجزیه کند مجبور است تقریبا در حدود «ریشه دوم آن عدد» ترکیب احتمالی را امتحان کند.مثلا در این مورد خاص تقریبا 38000 مورد بررسی می شود.

البته بررسی 38000 احتمال برای رایانه زیاد وقت گیر نیست ولی ، اگر عدد داده شده 10 رقمی نباشد و مثلا 400 رقمی باشد چه اتفاقی می افتد؟! ریشه دوم عددی  400 رقمی تقریبا 200 رقم دارد . عمر جهان تقریبا 1018 ثانیه است یعنی یک عدد 18 رقمی . حالا فرض کنید یک رایانه بتواند هر یک میلیون ترکیب احتمالی را در یک ثانیه چک کند ، در طول عمر جهان این رایانه قادر به چک کردن 1024 مورد است اما برای عدد 400 رقمی 10200 احتمال وجود دارد . به این معنی رایانه برای تجزیه این عدد 10178 برابر عمر جهان مشغول به محاسبه خواهد بود.
اما چک کردن اینکه یک عدد اول است یا نه به این اندازه دشوار نیست – به عبارت دیگر امتحان کنیم که ، آیا یک عدد می تواند قابل تجزیه شدن نباشد!

RSA هم به همین ترتیب عمل می کند . ابتدا دو عدد اول بسیار بزرگ ، p و q،پیدا می کنیم بطوری که هر کدام 100 یا 200 رقم داشته باشد. این اعداد محرمانه هستند ( در واقع همان کلید خصوصی ما هستند ) ، سپس این اعداد را در هم ضرب می کنیم تا عدد N=p.q ساخته شود .اساسا عدد N ی که به این ترتیب ساخته می شود کلید عمومی ما تلقی می شود. رسیدن به عدد N نسبتا کار ساده ای برای ما خواهد بود ، اما اگر شخصی بخواهد عدد N را تجزیه کند کار بسیار مشکل و تقریبا غیر ممکنی برایش خواهد بود.

اما چگونه می توان یک پیغام را بوسیله N برمز در آورد ؟ و چطور می توانیم مطلب برمز در آورده شده را با p و q رمزگشایی کرد؟

ادامه دارد...

کلید واژه ها :رمزنگاری آر اس ای  RSA Encryption

تایید هویت

"ریاضیات عبارت است از  اثبات بدیهی ترین چیز  به نا بدیهی ترین روش ممکن "
جورج پوليا


در پست قبلی به ارائه توضیحاتی پیرامون مفهوم کلید عمومی پرداختیم در این پست به توضیح مسئله تایید هویت که در حقیقت مکملی برای تامین کامل  امنیت  پیغام ارسالی در روش کلید عمومی است می پردازیم.

2.1.  تایید هویت

در طرح کلید عمومی مشکلی وجود داشت ، از آنجا که کلید عمومی واقعاً در دسترس عموم قرار می گیرد ، هر کسی می تواند یک پیام جعلی را برای شما بفرستد .  بنابراین دشمنان می توانند وانمود کنند که دوست شما هستند و  پیامی کاملا مشابه با پیام دوستان شما برایتان بفرستند زیرا هم دوستان و هم دشمنان شما به کلید عمومی دسترسی دارند . اطلاعات نادرست دشمن می تواند شما را کاملا گمراه کند .بنابراین چگونه می توان مطمئن شد که متنی که ادعا دارد که از طرف دوست شما رسیده واقعاً از طرف دوست شما رسیده باشد .
حال برای انجام این کار روشی را مطرح میکنیم :
فرض کنید شما و دوستتان همانطور که قبلا اشاره داشتیم کلید های عمومی و خصوصی Eb،Ea و Db ، Da را دراختیار داشته باشید . حال فرض کنید شما می خواهید پیامی را به دوستتان بفرستید به طوری که دوستتان از هویت واقعی شما در پیام اطمینان پیدا کند.
ابتدا فرض میکنید اسم خودتان یک متن رمزگذاری شده است ، سپس آن با استفاده از Da رمزگشایی میکنید . شما تنها کسی هستید که می توانید این کارا انجام دهید زیرا تنها فردی که Da را میداند شما هستید . سپس این متن رمز گذاری شده (که همان امضای دیجیتال نامه است ) را در کنار متن اصلی که می خواهید آنرا برای دوستتان ارسال کنید ، قرار میدهید ، و پس از انجام این کار تمامی متن بدست آمده را با استفاده از Eb رمزگذاری می کنیم یعنی کلید عمومی ای که کلید خصوصی آن تنها در دست دوست شماست.
وقتی دوست شما پیغام را دریافت میکند ، ابتدا آنرا با استفاده از Db رمزگشایی میکند و بنابراین او متنی خواهد داشت که دارای قسمتی الحاقی است که این قسمت دارای مفهوم خاصی نیست . این کاراکتر های نا منظم همان اسم شما است که با کلید عمومی خودتان رمزگذاری کرده بودید بنابراین او براحتی میتواند این کاراکتر های نامنظم را با استفاده از Ea رمزگذاری کند و با این کار به اسم شما برسد و از هویت واقعی شما اطمینان پیدا کند.

این کار به این دلیل قابلیت اجرایی دارد که :
 تنها کسی که میداند چگونه متنی تولید کند که در هنگام رمزگذاری به اسم شما تبدیل شود ، خود شما هستید ، به همین خاطر دوست شما می تواند اطمینان پیدا کند که این پیغام از جانب شماست.

شما هر متنی را می توانید برای تایید هویت رمزگذاری کنید که این متن رمز گشایی شده با کلید خصوصی ( یا به عبارتی رمزگذاری شده با کلید خصوصی )در واقع همان امضای دیجیتال شماست و تقریبا باید در هر پیام این متن عوض شود که کار بسیار ساده ای است. متن پیغام شما به این صورت خواهد بود :

«هنگام طلوع صبح حمله می کنیم !!!.رمز گشایی شده رشته کاراکتر "ABCDEFG" رشته کاراکتر "JDLEODK" است.»

برای مطمئن بودن از امنیت نامه ها در هر بار " ABCDEFG " و متن رمزگشایی شده مشتق از آن " JDLEODK " در هر پیغام عوض می شود.

اما در این سیستم خطری برای صحت اطلاعات رسیده وجود دارد . بیایید فرض کنیم شخصی در میانه راه از طریقی این اطلاعات برمز در آورده شده را سرقت کرده و قطعه امضا شده را بیابد و نامه ای ترتیب دهد که هم شامل امضا و هم شامل اطلاعات تحریف شده باشد در این حالت چه باید کرد؟

برای جلوگیری از این اتفاق سعی می شود امضای ما به نوعی به کل نامه برگردد . در عمل کل نامه امضا نمی شود بلکه از تابع هش (hash) استفاده می شود که بطور خلاصه به این معنی است که رشته بلندی از اطلاعات را توسط تابعی با رشته کوچکی جایگزین کنیم ( البته تابعی با شرایطی خاص ) سپس امضا روی این تکه انجام شود . بنابراین حتی اگر شخص نفوذ کننده امضای نامه نیز پیدا کند نمی تواند متن دلخواه خود را جایگزین متن اصلی کند و عملا بنابر ویژگی های ساختاری الگوریتم هش پیدا کردن متنی که داراری خروجی هش یکسان باشند غیر ممکن است. به این ترتیب نامه ای با امضای دیجیتالی در اختیار داریم که همچون اثر انگشت متعلق به خود همان نامه است.
البته توضیح و  ارائه نمونه هایی از الگوریتم های هش خود نیازمند به مقاله ای جدا گانه است که انشاء ا.. در یکی از پست های بعدی به آن خواهیم پرداخت.

در پست بعدی یکی از الگوریتم های متداول رمزنگاری را ارائه می دهیم که بر پایه کلید عمومی استوار است.

کلید واژه ها : تایید هویت  امضای دیجیتال  تابع هش  Certification   Digital Signatures  Hash Function ّ