الگوریتم 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

تایید هویت

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


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

2.1.  تایید هویت

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

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

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

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

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

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

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

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

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

مفهوم کلید عمومی

"در ابتدا امری بدیهی به نظر می رسد اما بیشتر که فکر می کنی نتیجه گیری های این اصل ناشناخته تر می شود و در انتها از تلاش برای فهمیدن اینکه منظور آن چیست دست می کشی"

برتراند راسل

از این پس می خواهیم با هم یک سری مقالاتی را پیرامون موضوعات رمزنگاری ، شیوهای متداول آن ، تایید هویت ، امضای دیجیتال و ... مرور کنیم.

1.مفهوم کلید عمومی یا Public Key:

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

1.1.به رمز در آوردن یک طرفه(سیستم کلید عمومی):

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

کلید واژه ها : رمزنگاری کلید عمومی کلید خصوص Encryption  Cryptography
Public Key  private key Trap-Door Ciphers