بخشی از مقاله
پروژه تئوری رمز گذاری
مقدمه و تاریخچه
هر کدام از ما وقتی به دنیای ماموران مخفی و جاسوسان فکر می کنیم چیز های زیادی به ذهنمان می رسد: سفرهای خارجی، ماموریت های خطرناک، اسلحه های عجیب و ماشین های سریع. کمتر کسی در کنار این چیزها به ریاضیات فکر می کند. اما باید بدانیم ریاضیات در فهمیدن پیامهای سری و شکستن رمزها نقش اساسی بازی می کند و در طول تاریخ ریاضیدان ها نتیجه نبردهای فراوانی را با شکستن رمزها تغییر داده اند.
رمزنگاری دانش تغییر دادن متن پیام به کمک یک کلید رمزنگاری و یک الگوریتم رمزنگاری است. به صورتی که تنها شخصی که از کلید و الگوریتم مطلع است قادر به استخراج متن اصلی از متن رمزشده باشد و شخصی که از یکی یا هردوی آنها اطلاعی ندارد، نتواند به محتوای پیام دسترسی پیدا کند. رمزنگاری از طریق پنهان نگاه داشتن الگوریتم رمزنگاری منسوخ است. در روشهای جدید رمزنگاری فرض بر آن است که همگان الگوریتم رمزنگاری را میدانند. آنچه پنهان است فقط کلید است. رمزنگاری علمی است که به وسیله آن میتوان اطلاعات را بصورتی امن منتقل کرد حتی اگر مسیر انتقال اطلاعات (کانالهای ارتباطی) ناامن باشد. دریافتکننده اطلاعات آنها را از حالت رمز خارج میکند (decrypting) که به این عمل رمزگشائی گفته میشود .
توجه داشته باشید که رمزنگاری به تغییر ساده محتویات یک متن گفته میشود با کدگذاری (coding) تفاوت دارد. در این صورت تنها هر کاراکتر با یک نماد تغییر میکند. کلمه Cryptography بر گرفته لغات یونانی‘kryptos’ به مفهوم " محرمانه " و grapheinبه معنای نوشتن " است. قبل از هر چیز لازم است بین رمز و کد تفاوت قائل شویم. رمز به مفهوم تبدیل کاراکتر به کاراکتر یا بیت به بیت ؛ بدون تغییر محتویات زبان شناختی آن است. در مقابل " کد " تبدیلی است که کلمهای را با یک کلمه یا نماد دیگر جایگزین میکند .
دانش رمزنگاری بر پایه مقدمات بسیاری از قبیل تئوری اطلاعات، نظریه اعداد و آمار بنا شدهاست.امروزه در کشور ما نیز دوره دکترای رمزنگاری که از شاخه های رشته ریاضی کاربردی میباشد برگزار میشود.
شروع و توسعه رمزنگاری
اولین بار سزار امپراتور رم باستان برای آنکه بتواند بدون اطلاع دشمن با ا ارتشش در سراسر دنیا در ارتباط باشد نوعی رمز را بکار گرفت. این رمز به این شکل بود که برای فرستادن یک پیام جای هر حرف را با سومین حرف بعد از آن در الفبا عوض می کردند، مثلا به جای 'A' حرف 'D' و به جای 'X' حرف 'A' را می گذاشتند.
بنابراین برای از کد خارج کردن پیام ها کافی بود دریافت کننده جای هر حرف را با سومین حرف بعد از آن در الفبا عوض کند. مثلا سعی کنید این پیغام سزاری را از رمز خارج کنید:
hqhpb dssurdfklqj
wkluwb ghdg
uhwuhdw wr iruhvw
در این کدگذاری ریاضی زمانی مطرح می شود که به هر حرف یک عدد نسبت دهیم. در این صورت فرایند کد کردن مثل اضافه کردن عدد 3 به عدد اولیه خواهد بود
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
مثلا برای به رمز درآوردن 'A' : داریم 0+3=3
برای اینکه در مورد حرف های نزدیک به پایان الفبا دچار مشکل نشویم بهتر است به جای جمع معمولی از جمع به پیمانه 26 استفاده کنیم، یعنی به جای هر عدد از باقیمانده تقسیم آن عدد بر 26 استفاده کنیم.
مثلا:
برای 'X' داریم: (به پیمانه 26) 23+3=26=0
برای 'Y' داریم: (به پیمانه 26) 24+3=27=1
برای 'T' داریم: (به پیمانه 26) 19+3=21=21
برای از رمز درآوردن هم می توانیم از تفریق به پیمانه 26 استفاده کنیم. واضح است که می توانیم به جای انتقال 3 تایی از هر انتقالی بین 1 و 25 استفاده کنیم، اما همانطور که احتمالا حدس زده اید شکستن این رمز خیلی ساده است یعنی یک جاسوس می تواند با امتحان کردن همه 25 انتقال ممکن به سرعت رمز را بشکند.
حالا به سراغ یک روش پیچیده تر می رویم. فرض کنید به ازای هر حرف الفبا یک علامت جایگزین کنیم، مثلا '*' به جای 'A' و '+' به جای 'B'. مثل رمزی که ماری ملکه اسکاتلند برای مکاتباتش بر علیه الیزابت اول ملکه انگلیس بکار می گرفت .
تا مدت ها مردم فکر می کردند شکستن این رمز ناممکن است تا اینکه آمار ریاضی بوجود آمد .
نموداری که می بینید فراوانی حروف الفبا را در زبان انگلیسی نشان میدهد.
این اطلاعات از شمارش حروف مختلف در حجم زیادی از نوشته ها مثل کتاب ها و روزنامه ها بدست آمده است. این نمودار مثلا نشان می دهد به طور میانگین 13.5 درصد از حروف بکار رفته در متن های انگلیسی E هستند، که فراوان ترین حرف الفبا است. بنابراین وقتی رمزی از نوع بالا داریم احتمالا علامتی که بیش از همه تکرار می شود علامت متناظر E است و فراوانترین علامت بعد از آن متناظر 'T' است. سرنخ های دیگری هم وجود دارد مثلا تنها دو کلمه یک حرفی در انگلیسی وجود دارد: 'I' و 'A' و همچنین 'AND' و 'THE' کلمات خیلی معمولی هستند با کمک این سرنخ ها و کمی آزمایش و خطا میتوان اینگونه رمزها را شکست.همین روش باعث شد که ماری سرش را از دست بدهد.
براساس متون موجود در مورد رمزنگاري تاريخچه اين علم را میتوان در نگاهي گذرا بصورت زير بيان كرد :
1 - شروع رمزنگاري به سال 1900 قبل از ميلاد برميگردد برطبق اساد موجود يك مصري درآن زمان كه كلمات بصورت تصوير بيان ميشد ازتصاويري استفاده كرده كه متداول نبوده بنابراين شروع رمزنگاري از مصريان ميباشد . چهارصد سال بعد در بينالنهرين وحه هئي نوشته شد كه شامل فرمولهائي رمزي از تهيه شيشه براي كوزه گري ميباشد .
2 - 500 سال قبل از ميلاد يك نويسنده يهودي كتابي نوشت كه كلمات آن برعكس نوشته شده بود اين روش بنام رمز آتابش ناميده شد .
3 - در سال 487 قبل از ميلاد اسكيتال در يونان بوجود آمد و مورد استفاده قرار گرفت
4 - 400 سال بعد ژوليوس سزار در مكاتبات دولتي از رمز سزار استفاده كرد . او در اين رمز جاي حروف الفبا را عوض كرد . رمز سزار هرچند در نسبت به رمز آتابش ساده تر است اما مدارك محرمانه دولتي در نگاه اول قابل فهميدن نبود .
5 - بين سالهاي 0 تا 400 بعد از ميلاد رمز به عنوان يك هنر توسط هنديان در كاماسوترا بيان شده است . در كاما سوترا به شيوه هاي ساده رمزنگاري اشاره شده است .
6 - 200 سال بعد از ميلاد ليدن دستورالعمل هاي مهم خود را بصورت رمز مي نوشت .
7 - در شروع امپراتوري اسلامي ابوعبدل الرحمان الخليل ابن احمد امرابن تمام الفرهادي الزيدي اليهمدي كتابي در علم رمزنگاري نوشت كه الهام گرفته از رمزهاي يوناني ميباشد كه براي امپراتوري روم شرقي نوشته شده بود . البته اين كتاب مفقود شده است شيوه هائي كه در اين كتاب اشاره شده است در جنگ جهاني دوم در مقابل رمز انگما نيز استفاده شده است .
8 - در سال 855 ابوبكر احمد ابن علي ابن وحششيه نباتي رمزهاي مختلفي را ابداع كرده تست 9 - در حكومت غزنويان كه كشورگشائي هاي زيادي داشتند در بحث نظامي و سفارت خانه اي خود به وفور از رمزها استفاده مي كردند .مقامات عاليرتبه حكومتي با توجه به موقعيتشان از سيستم رمز مخصوص آن مقام استفاده مي كردند .
10 - در سالهاي بعد از 1266 ( بعد از ميلاد ) در ونيز رمزهائي ساده در عالم سياست استفاده مي شد . در اين رمز جاي حروف با نقطه و ضريبدر عوض مي شد .
11 - در حدود 1500 ( بعد از ميلاد ) شخصي بنام روگر بكن رمزهاي متعددي را نوشت او در اول كارهايش مينويسد . : كسي كه متن محرمانه اي را طوري بنويسد كه بقيه بفهمند احمق مي باشد .
12 - در 1300 ميلادي ابن خلدون جهت استفاده اداره ماليات و ارتش براي ساده نويسي و پنهان كاري از نوعي رمز استفاده مي كرد .
13 - در سالهاي بعد از 1379 ميلادي گابريل دي لاوندي بتقاضلي كلمنت هفتم رمزي نوشت كه تركيبي از جابجائي حروف و كدها بود اين رمز سالها مورد استفاده دولتمردان قرارگرفت و تا 400 سال اين رمز كاربرد داشت .
14 - جوفري چاوسر در سالهاي 1392 رمزي نوشت كه تركيبي از علائم و جابجائي حروف و كد بود
15 - در 1412 ميلادي عابد الله الكلكشندي دائره المعارفي عربي نوشت كه 14 جلد مي باشد و يكي از جلد هاي آن مربوط به رمزنگاري و منصوب به طالب موصولي مي باشد . او براي اولين بار ؛ چند بار از جانشاني استفاده مي كند او در كتاب خود راجع به رمزگشائي نيز بحث مي كند كه رمز شكني با استفاده از روش فركانسي منصوب به او مي باشد .
16 - در سال 1466 اون باتيستا البرتي رمزي را اختراع كرد كه امروزه به رمز ( Capital Midnight Decode Badge ) مشهور است براي نزديك به 400 سال يعني تا 1800 اين رمز شكسته نشد
17 - در 1518 اولين كتاب چاپي در باره رمز توسط جوهان تريتيميوس نوشته شده او در اني كتاب از رمزهاي مختلف سخن ميگويد او از رمز polyalphabetic با شيوه جانشاني مستطيلي را توضيح مي دهد .
18 - جيوان باتيستاپورتا در سال 1553 رمزي را ابداع كرد كه در آن ازيك عبارت بعنوان كليد استفاده مي شود بسياري از نويسندگان اين رمزبلاسو را با رمز ويگنر اشتباه ميگيرند .
19 - جيواني باتيستا پورتا در سال 1563 از رمزي استفاده كرد كه در آن رمز ضمن استفاده از اسپل غلط و در ضمن جانشاني و انتقال از حروف عجيب و غريب در متن هاي خود استفاده كرد .
20 - در سال 1585 بلاليسس دي ويگنر كتابي در مورد رمز نوشت با متنهاي رمزي همراه با سيستم رمز كليد خودكار ( يعني كليد رمز در متن قبلي قرار دارد . اين سيستم بعد ها در رمزهاي DES,CFB,CBC مورد استفاده قرار گرفت .
21 - در سال 1623 فرانسيس بيكن رمزي بنام رمز كننده 5 - بيتي باينري را ابداع كرد .
22 - توماس جفرسون در سال 1790 با كمك دكتر جفرسون ( رياضي دان ) چرخ رمز را اختراع كردند . اين رمز تكامل پيدا كرد و بعدها در جنگ جهاني دوم مورد استفاده قرار گرفت .
23 - در سال 1817 سرهنگ وادستورد ديسكهاي چرخدنده هاي رمز كننده اي با تعداد حروف متفاوت را اختراع كرد
24 - چارلز ويتستون رمز ( بازي مطبوع ) را در 1854 اختراع كرد . او همچنين رمز وادستورد را تكميل كرد .
25 - اختراع تكامل يافته چرخ رمز نگاري توسط چارلز بابگي در 1854
26 - در 1857 ادميرال سرفرانسيس بيوفورت رمز جديدي اختراع كرد كه نوعي رمز ويگنر مي باشد . البته كار او س از مرگش توسط برادرش چاپ شد .
27 - پليني چاسي اولين شرح را براي رمزهاي توموگرافيك در 1859 نوشت .
28 - بين سالهاي 1861 الي 1980 بحث رمز عمومي شد و در سال 1769 سندي در امريكا بدست امده كه بنحوي با رمز سروكار دارد .
29 - در 1861 فردريك كاساسكي كتابي نوشت برچگونگي شكستن رمز چند الفبائي كه چند صد سال امن مانده بود
30 - در جنگهاي داخلي امريكا جنوبي ها از جانشين كردن حروف در متن رمزي استفاده كردند درصورتي كه شمالي ها از رمز ويگنر كه بتازگي از طرف كاساسكي ابداع شده بود استفاده مي كردند .
31 - در 1891 سرهنگ اتيني بازرايز بعد از انكه مدل جديد چرخ رمزكننده را ابداع كرد و ارتش فرانسه از آن استقبال نكرد آن انتشار داد
32 - كاپيتان پاركت هيت در سال 1913 با تغيير در چرخ رمز كننده منجر به رمز كننده M-138-A از WW-II شد .
33 - در سال سال 1916 سرتيپ ژوزف مورجني رمز هيت را بصورت چرخ رمزي درآورد و جايگزيني حروف را قويتر انجام داد و در نهايت منجر به دستكاه رمز كننده M-94 شد .
34 - در 917 ويليام فردريك فايردمن كه پدر علم رمز امريكا ناميده مي شود در دولت محلي ريوربنك امريكا بعنوان متخصص رمز استخدام شد و اولين مركز آموزشي رمز را براي ارتش آمريكا ايجاد كرد و بعدها به خاطر فعاليتش به واشنگتن رفت .
35 - در همين سال گيلبرت ورنام رمزي را ابداع نمود كه كاملا" از كليدهاي اتفاقي استفاده مي شد كه ديگر تكرار نمي شد تا اين تاريخ اين اولين ماشين رمزكننده اي است كه به ثبت رسيده است . رمز او براي استفاده در جنگ جهاني اول پيشنهاد شد ولي ارتش امريكا آن را نپذيرفت و در كارهاي بازرگاني بكار گرفته شد .
36 - در اواخر جنگ جهاني اول آلمانها سيستم رمز كننده ADFGVX را اختراع كردند كه توسط رمز شكن مشهور فرانسوي پينوين شكسته شد .
37 - در 1919 الكساندر كوخ رمز استوانه اي را ابداع كرد كه در 1927 امتياز رمز را به ارتور اسچربيوس كه مخترع ماشين انيگما بود واگذار كرد .
38 - در سوئد گرهارد دراما رمز استوانه اي را ابداع نمود كه بعدها توسط وايلهلم هگالين به مجموعه اي از رمز مشهور شد . بعدها دولت سوئد در 1919 پيشنهاد كرد شركتي كه شركتي با نام CryptoAG تاسيس گردد و دولت نيز در موارد مربوط به رمز از آن شركت استفاده كند . اين شر39 - در 1921 ادوارد هوگ هيرن كد هاي الكتريكي را ابداع نمود . كه در حال حاضر نيز فعال است و بخاطر فروش رمز كننده به ايران مورد چالش قرار گرفت .
39 - تا سال 1924 رمز وون كريا كه به شدت مورد استفاده دپيماتهاي آلماني قرار مي گرفت توسط رمز شكنان امريكائي در مدت دو ساعت و چهل دقيقه شكسته شد و بعد از اين تاريخ ديگر مورد استفاده قرار نگرفت .
40 - از سال 1925 به بعد كاربران رمز از بانكها . نيرو هاي مسلح و عاشقان . مورد استفاده خلافكاران نيز قرار گرفت بطوري كه در اداره رمز در واشنگتن دي سي امريكا گشايش يافت .
41 - بين سالهاي 1927 الي 1933 يكي از بازنشستگان نيروي دريائي آمريكا كه نام او مشخص نشد شبكه رمزي قوي ايجاد كه كه مورد استفاده وسيع اچاقچيان قرار گرفت و بسياري از رمزهاي انان شكسته نشد .
42 - لستر هيل در 1929 مقاله زيبائي تحت عنوان " رمز نگاري در جبر حروف انتشار داد در اين رمز از ماتريسها جهت رمز كردن استفاده مي شود .
43 - بين سالهاي 1933 تا 1945 رمز انگما كه به المان برده شده بود و تكامل پيدا كرد و مورد استفاده المانها قرار گرفت توسط يك رياضدان لهستاني به نام مارين رجوسكي شكسته شد . اين رمز در جنگ جهاني در انگليس هم توسط آلن ترنينگو و گردن ريچمن شكسته شد .
44 - در همين ايام رمز ژاپني ها توسط هربرت ياردلي شكسته شد و ژاپنيس ها رمز ارغواني را ابداع كردند اين رمز نيز توسط گروهي به سركردگي ويليام فريدمن شكسته شد .
45 - اختراع رمز كننده SIGABA_131_C در سال 1930 به ويليام فايردمن نسبت داده مي شود . اين رمز كننده كامل تر از رمز كننده انيگما مي باشد . و داراي پانزده استوانه براي انتقال رقم ها و نج استوانه براي كنترل باند مي باشد .
46 - در سال 1930 رمز كننده Typex جايگزين رمز كننده انيگما مي شود .
47 - در سال 1970 دكتر هورست فيستال در يك پروژه تحقيقاتي روز رمزها مجموعه اي از رمزرمز ها را بوجود آورد كه منجر به رمز كننده DES گرديد .
48 - در سال 1976 در شركت IBM طراحي رمزي براساس رمز ليسوفر به نام رمز FIPS PUB 46 انجام گرفت كه داراي S - BOX پيشرفته و همچنين كاهش اندازه كليد را دربرداشت . و براي بيست سال در برار حملات مقاومت كرد . و بدين خاطر بسيار مورد استفاده قرار گرفت .
49 - در سال 1976 وايت فيلد ديفي و مارتين هلمن براي اولين بار در مقاله خويش كليد عمومي را معرفي كرد .
50 - در سال 1977 براساس مقاله هلمن سه ماتور كار رمز بنامهاي رونالد ريوست . عدي شامير و لئونارد ادلمن رمز RSA ابداع كردند . در اوليل كار سازمان NSA امريكا اجازه نداد كه كار انها انتشار پيدا كند ولي بعد از مدتي كار خود را انتشار دادند كه همزمان با انتشار دو ژورنال Cryptologia و Cryptology مي باشد . در واقع اين سه نفر مقاله هلمن را عملي كردند .
51 - در سال 1978 در ACM براي اولين بار RSA انتشار يافت
52 - در 1984 الي 1985 رمز ROT13 در خبرنامه USENET انتشار يافت .
53 - در 1990 جيمز مسي وليي در سيوزرلند رمز هاي بلوكي استاندارد را كه به دليل استفاده ساده تر جاي رمز DES را گرفت با نام IDEA ابداع كرد .
54 - براي اولين بار در 1991 رمز كوانتومي توسط بنتووبراساد مطرح شد . آنها از يك فوتون جهت انتقال كليد استفاده كردند در اين رمز كننده گيرنده و فرستنده بايد داراي كابل فيبر اپتيكي باشند
55 - در همين سال زيمرمن رمز PGP را براي اولين بار معرفي كرد اين رمز به دليل سادگي و امنيت بالا مورد استفاده جهاني قرار گرفته است .
56 - در سال 1994 پروفسور رون ريوست به دنبال ابداع RC4 رمز RC5 را ابداع نمود
معرفی و اصطلاحات رمز نگاری از زاویه دیگر :
رمزنگاری علم کدها و رمزهاست. یک هنر قدیمی است و برای قرنها بمنظور محافظت از پیغامهایی که بین فرماندهان، جاسوسان و دیگران ردوبدل میشده، استفاده شده است تا پیغامهای آنها محرمانه بماند.
ثبات هویت فرستنده و گیرنده پیغام داریم و در ضمن باید از عدم تغییر محتوای پیغام مطمئن شویم. این سه موضوع یعنی محرمانگی، تصدیق هویت و جامعیت در قلب امنیت ارتباطات دیتای مدرن قرار دارند و میتوانند از رمزنگاری استفاده کنند.
اغلب این مساله باید تضمین شود که یک پیغام فقط میتواند توسط کسانی خوانده شود که پیغام برای آنها ارسال شده است و دیگران این اجازه را ندارند. روشی که تامین کننده این مساله باشد "رمزنگاری" نام دارد. رمزنگاری هنر نوشتن بصورت رمز است بطوریکه هیچکس به غیر از دریافت کننده موردنظر نتواند محتوای پیغام را بخواند.
رمزنگاری مخففها و اصطلاحات مخصوص به خود را دارد. برای درک عمیقتر به مقداری از دانش ریاضیات نیاز است. برای محافظت از دیتای اصلی ( که بعنوان plaintext شناخته میشود)، آنرا با استفاده از یک کلید (رشتهای محدود از بیتها) بصورت رمز در میآوریم تا کسی که دیتای حاصله را میخواند قادر به درک آن نباشد. دیتای رمزشده (که بعنوان ciphertext شناخته میشود) بصورت یک سری بیمعنی از بیتها بدون داشتن رابطه مشخصی با دیتای اصلی بنظر میرسد. برای حصول متن اولیه دریافتکننده آنرا رمزگشایی میکند. یک شخص ثالت (مثلا یک هکر) میتواند برای اینکه بدون دانستن کلید به دیتای اصلی دست یابد، کشف رمزنوشته (cryptanalysis) کند. بخاطرداشتن وجود این شخص ثالث بسیار مهم است.
رمزنگاری دو جزء اصلی دارد: یک الگوریتم و یک کلید. الگوریتم یک مبدل یا فرمول ریاضی است. تعداد کمی الگوریتم قدرتمند وجود دارد که بیشتر آنها بعنوان استانداردها یا مقالات ریاضی منتشر شدهاند. کلید، یک رشته از ارقام دودویی (صفر و یک) است که بخودیخود بیمعنی است. رمزنگاری مدرن فرض میکند که الگوریتم شناخته شده است یا میتواند کشف شود. کلید است که باید مخفی نگاه داشته شود و کلید است که در هر مرحله پیادهسازی تغییر میکند. رمزگشایی ممکن است از همان جفت الگوریتم و کلید یا جفت متفاوتی استفاده کند.
دیتای اولیه اغلب قبل از رمزشدن بازچینی میشود؛ این عمل عموما بعنوان scrambling شناخته میشود. بصورت مشخصتر، hash functionها بلوکی از دیتا را (که میتواند هر اندازهای داشته باشد) به طول از پیش مشخصشده کاهش میدهد. البته دیتای اولیه نمیتواند از hashed value بازسازی شود. Hash functionها اغلب بعنوان بخشی از یک سیستم تایید هویت مورد نیاز هستند؛ خلاصهای از پیام (شامل مهمترین قسمتها مانند شماره پیام، تاریخ و ساعت، و نواحی مهم دیتا) قبل از رمزنگاری خود پیام، ساخته و hash میشود.
یک چک تایید پیام (Message Authentication Check) یا MAC یک الگوریتم ثابت با تولید یک امضاء برروی پیام با استفاده از یک کلید متقارن است. هدف آن نشان دادن این مطلب است که پیام بین ارسال و دریافت تغییر نکرده است. هنگامی که رمزنگاری توسط کلید عمومی برای تایید هویت فرستنده پیام استفاده میشود، منجر به ایجاد امضای دیجیتال (digital signature) میشود.
الگوریتمها
طراحی الگوریتمهای رمزنگاری مقولهای برای متخصصان ریاضی است. طراحان سیستمهایی که در آنها از رمزنگاری استفاده میشود، باید از نقاط قوت و ضعف الگوریتمهای موجود مطلع باشند و برای تعیین الگوریتم مناسب قدرت تصمیمگیری داشته باشند. اگرچه رمزنگاری از اولین کارهای شانون (Shannon) در اواخر دهه ۴۰ و اوایل دهه ۵۰ بشدت پیشرفت کرده است، اما کشف رمز نیز پابهپای رمزنگاری به پیش آمده است و الگوریتمهای کمی هنوز با گذشت زمان ارزش خود را حفظ کردهاند. بنابراین تعداد الگوریتمهای استفاده شده در سیستمهای کامپیوتری عملی و در سیستمهای برپایه کارت هوشمند بسیار کم است.
۱-۲ سیستمهای کلید متقارن
یک الگوریتم متقارن از یک کلید برای رمزنگاری و رمزگشایی استفاده میکند. بیشترین شکل استفاده از رمزنگاری که در کارتهای هوشمند و البته در بیشتر سیستمهای امنیت اطلاعات وجود دارد data encryption algorithm یا DEA است که بیشتر بعنوان DES شناخته میشود. DES یک محصول دولت ایالات متحده است که امروزه بطور وسیعی بعنوان یک استاندارد بینالمللی شناخته میشود. بلوکهای ۶۴بیتی دیتا توسط یک کلید تنها که معمولا ۵۶بیت طول دارد، رمزنگاری و رمزگشایی میشوند. DES از نظر محاسباتی ساده است و براحتی میتواند توسط پردازندههای کند (بخصوص آنهایی که در کارتهای هوشمند وجود دارند) انجام گیرد.
این روش بستگی به مخفیبودن کلید دارد. بنابراین برای استفاده در دو موقعیت مناسب است: هنگامی که کلیدها میتوانند به یک روش قابل اعتماد و امن توزیع و ذخیره شوند یا جایی که کلید بین دو سیستم مبادله میشوند که قبلا هویت یکدیگر را تایید کردهاند عمر کلیدها بیشتر از مدت تراکنش طول نمیکشد. رمزنگاری DES عموما برای حفاظت دیتا از شنود در طول انتقال استفاده میشود.
کلیدهای DES ۴۰بیتی امروزه در عرض چندین ساعت توسط کامپیوترهای معمولی شکسته میشوند و بنابراین نباید برای محافظت از اطلاعات مهم و با مدت طولانی اعتبار استفاده شود. کلید ۵۶بیتی عموما توسط سختافزار یا شبکههای بخصوصی شکسته میشوند. رمزنگاری DESسهتایی عبارتست از کدکردن دیتای اصلی با استفاده از الگوریتم DES که در سه مرتبه انجام میگیرد. (دو مرتبه با استفاده از یک کلید به سمت جلو (رمزنگاری) و یک مرتبه به سمت عقب (رمزگشایی) با یک کلید دیگر)
این عمل تاثیر دوبرابر کردن طول مؤثر کلید را دارد؛ این عمل یک عامل مهم در قدرت رمزکنندگی است.
الگوریتمهای استاندارد جدیدتر مختلفی پیشنهاد شدهاند. الگوریتمهایی مانند Blowfish و IDEA برای زمانی مورد استفاده قرار گرفتهاند اما هیچکدام پیادهسازی سختافزاری نشدند بنابراین بعنوان رقیبی برای DES برای استفاده در کاربردهای میکروکنترلی مطرح نبودهاند. پروژه استاندارد رمزنگاری پیشرفته دولتی ایالات متحده (AES) الگوریتم Rijndael را برای جایگزینی DES بعنوان الگوریتم رمزنگاری اولیه انتخاب کرده است. الگوریتم Twofish مشخصا برای پیادهسازی در پردازندههای توانـپایین مثلا در کارتهای هوشمند طراحی شد.
در ۱۹۹۸ وزارت دفاع ایالات متحده تصمیم گرفت که الگوریتمها Skipjack و مبادله کلید را که در کارتهای Fortezza استفاده شده بود، از محرمانگی خارج سازد. یکی از دلایل این امر تشویق برای پیادهسازی بیشتر کارتهای هوشمند برپایه این الگوریتمها بود.
برای رمزنگاری جریانی (streaming encryption) (که رمزنگاری دیتا در حین ارسال صورت میگیرد بجای اینکه دیتای کدشده در یک فایل مجزا قرار گیرد) الگوریتم RC4 سرعت بالا و دامنهای از طول کلیدها از ۴۰ تا ۲۵۶ بیت فراهم میکند. RC4 که متعلق به امنیت دیتای RSA است، بصورت عادی برای رمزنگاری ارتباطات دوطرفه امن در اینترنت استفاده میشود.
رمزنگاري به شيوه كليد متقارن
همانطور كه در شكل ميبينيد، در رمزنگاري به شيوه كليد متقارن، تابع رمزگذاري ()E با استفاده از يك كليد محرمانه k، پيغام متني P را به متن رمزشده C تبديل ميكند. دريافتكننده اين پيغام رمزشده، با اعمال تابع رمزگشايي ()D و همان كليد محرمانه k، اين پيغام را به حالت اوليه P بازميگرداند.
بهترين تكنيك رمزنگاري به شيوه كليد متقارن، DES يا Data Encryption Standard نام دارد و از سال 1976 مورد استفاده قرار گرفته است. تكنيك DES در واقع يك متن كدشدهِ تكراري است كه به قطعات 64 بيتي متن ساده متصل ميشود.
تابع رمزگذاري به واسطه جابهجايي، توسعه، انتقال، فشردهسازي، تعويض و تركيب قطعات 64 بيتي متن پيغام با يك كليد 56 بيتي، هر قطعه از متن ورودي را به يك قطعه متن 64 بيتي كدشده تبديل ميكند. گيرنده پيغام، با اجراي معكوس مراحل رمزگذاري و با استفاده از همان كليد 56 بيتيk ، قادر است پيغام را به حالت اوليه بازگرداند.
شکل1- فرآيند رمزگذاري از فرمول (C=E(P تبعيت ميکند. براي رمزگشايي پيغام از فرمول (P=D(C استفاده ميشود. در رمزگذاري به شيوه کليد متقارن،
رابطه K1=K2 برقرار است. در رمزگذاري به شيوه کليد عمومي، کليد رمزگذاري با کليد عمومي دريافتکننده پيغام يکسان است و کليد رمزگشايي همان کليد خصوصي دريافتکننده است.
تكنيك DES از همان ابتداي كار، به عنوان يك روش ايمن براي انجام تراكنشهاي مالي مورد استفاده قرار گرفت، اما امروزه كارايي گذشته را ندارد. فضاي 56 بيتي كليد مورد استفاده در اين تكنيك، 2 به توان 56 كليد منحصر بهفرد توليد ميكند. بنابراين، جستوجوي دقيق فضاي كليد، متضمن دستيابي به مقدار كليدk و تبديل متن كدشدهC به پيغام اوليه P خواهد بود.
با اينكه فضاي 256 بيتي براي انسانها بسيار بزرگ به نظر ميرسد، جستوجوي آن براي ماشينهاي ويژهِ كشفرمز يا سوپركامپيوترهاي امروزي، چندان مشكل نيست. در نتيجه، محققان روشهاي جديدي را براي پيادهسازي الگوريتمهاي رمزنگاري بهشيوه كليد متقارن ابداع كردهاند.
از ميان اين روشها ميتوان از DES سهگانه (در اين روش، تكنيك DES سه بار پياپي و با استفاده از سه كليد 56 بيتي متفاوت اجرا ميشود. در اين نوع رمزنگاري، فضاي كليد مود استفاده، معادل يك كليد 168 بيتي خواهد بود.)، تكنيك IDEA يا International Data Encryption Algorithm با كليدهاي 128 بيتي، تكنيك RC4 (كليدهايي با فضاي بالاي دو كيلوبيت يا 2048 بيت) و تكنيك RC5 (كليدهايي با فضاي بالاي 256 بيت) نام برد.
هنگام استانداردسازي روشهاي رمزنگاري در سال 1997 مؤسسه ملي استاندارد و فناوري با برگزاري يك مسابقه عمومي، تكنيك DES را با تكنيك AES يا Advanced Encription Standard جايگزين كرد. برنده اين مسابقه روشي موسوم به Rijndael يا Rhine-doll بود كه دو رمزنگار بلژيكي معرفي كردند.
تكنيك AES مانند DES نوعي رمزنگاري با استفاده از قطعات تكراري متن كدشده است، اما در آن از متنهاي 128 بيتي همراه كليدهاي 128، 192 يا 256بيتي استفاده ميشود. بهرهگيري از كليد 256 بيتي، تعداد 2 به توان 256 انتخاب را براي كليد فراهم ميكند. جستوجوي اين فضا حتي براي كامپيوترهاي پيشرفتهِ امروزي نيز غيرممكن است.
از آنجايي كه براي اجراي رمزنگاري به شيوه كليد متقارن از فرمولهاي رياضي ساده استفاده ميشود، اين شيوه با سرعت نسبتاً زيادي به اجرا در ميآيد. صرفنظر از فضاي كليد، تمام رويكردهاي رمزنگاري به شيوه كليد متقارن يك ضعف مشابه دارند. براي بازگرداندن پيغام به حالت اوليه، كليد مورد استفاده در رمزگذاري بايد در اختيار دريافتكننده پيغام قرار بگيرد. در اين بين اگر كسي به كليد دسترسي يابد، رمزنگاري پيغام بيفايده خواهد بود. براي رفع مشكل انتقال كليد، ميتوان از رمزنگاري به شيوه كليد عمومي بهره گرفت.
الگوریتم رمزنگاری قابل بازگشت (Rijndael)
string SecureDataAlg(string StrInp,byte[] key,byte[] iv)
{
byte[] input = Encoding.UTF8.GetBytes(StrInp);
CryptoStream cryptoStream = null;
RijndaelManaged rijndael = null;
ICryptoTransform rijndaelTransform = null;
MemoryStream memStream = null;
rijndael = new RijndaelManaged();
rijndael.Key = key;
rijndael.IV = iv;
rijndaelTransform = rijndael.CreateEncryptor();
memStream = new MemoryStream();
cryptoStream = new CryptoStream(memStream, rijndaelTransform, CryptoStreamMode.Write);
cryptoStream.Write(input, 0, input.Length);
cryptoStream.FlushFinalBlock();
byte[] str = memStream.ToArray();
return Convert.ToBase64String(str);
}
متغیر key ، 16 بایتی و متغیر iv ، 24 بایتی که به عنوان کلید عمومی و کلید اختصاصی استفاده می شوند.
الگوريتم رمزنگاري BlowFish :
الگوريتم رمزنگاري متقارن BlowFish يكي از روشهاي متداول رمزنگاري است . اين الگوريتم با پذيرش كليد عمومي از 32 بيت تا 448 بيت ، جايگزين خوبي براي روشهائي مثل DES است . ( خصوصا در كشورهائي مثل آمريكا كه صدور و فروش نرم افزارهاي داراي سيستم رمزنگاري به خارج از كشور ممنوع و براي استفاده هاي داخلي هم در طول كليد محدوديتهائي وجود دارد.)
از اين روش امروزه به وفور در نرم افزارهاي گسترده و سازماني استفاده ميشه ، به عنوان مثال Oracle . اين الگوريتم در سال 1993 توسط Bruce Schneier طراحي و توسعه داده شد فايل هدر براي دسترسي به توابع :
#define MAXKEYBYTES 56 /* 448 bits */
// #define little_endian 1 /* Eg: Intel */
#define big_endian 1 /* Eg: Motorola */
short opensubkeyfile(void);
unsigned long F(unsigned long x);
void Blowfish_encipher(unsigned long *xl, unsigned long *xr);
void Blowfish_decipher(unsigned long *xl, unsigned long *xr);
متن الگوريتم و پياده سازي توابع :
#ifdef little_endian /* Eg: Intel */
#include <dos.h>
#include <graphics.h>
#include <io.h>
#endif
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#ifdef little_endian /* Eg: Intel */
#include <alloc.h>
#endif
#include <ctype.h>
#ifdef little_endian /* Eg: Intel */
#include <dir.h>
#include <bios.h>
#endif
#ifdef big_endian
#include <Types.h>
#endif
#include "Blowfish.h"
#define N 16
#define noErr 0
#define DATAERROR -1
#define KEYBYTES 8
#define subkeyfilename "Blowfish.dat"
unsigned long P[N + 2];
unsigned long S[4][256];
FILE* SubkeyFile;
short opensubkeyfile(void) /* read only */
{
short error;
error = noErr;
if((SubkeyFile = fopen(subkeyfilename,"rb")) == NULL) {
error = DATAERROR;
}
return error;
}
unsigned long F(unsigned long x)
{
unsigned short a;
unsigned short b;
unsigned short c;
unsigned short d;
unsigned long y;
d = x & 0x00FF;
x >>= 8;
c = x & 0x00FF;
x >>= 8;
b = x & 0x00FF;
x >>= 8;
a = x & 0x00FF;
//y = ((S[0][a] + S[1][b]) ^ S[2][c]) + S[3][d];
y = S[0][a] + S[1][b];
y = y ^ S[2][c];
y = y + S[3][d];
return y;
}
void Blowfish_encipher(unsigned long *xl, unsigned long *xr)
{
unsigned long Xl;
unsigned long Xr;
unsigned long temp;
short i;
Xl = *xl;
Xr = *xr;
for (i = 0; i < N; ++i) {
Xl = Xl ^ P[i];
Xr = F(Xl) ^ Xr;
temp = Xl;
Xl = Xr;
Xr = temp;
}
temp = Xl;
Xl = Xr;
Xr = temp;
Xr = Xr ^ P[N];
Xl = Xl ^ P[N + 1];
*xl = Xl;
*xr = Xr;
}
void Blowfish_decipher(unsigned long *xl, unsigned long *xr)
{
unsigned long Xl;
unsigned long Xr;
unsigned long temp;
short i;
Xl = *xl;
Xr = *xr;
for (i = N + 1; i > 1; --i) {
Xl = Xl ^ P[i];
Xr = F(Xl) ^ Xr;
/* Exchange Xl and Xr */
temp = Xl;
Xl = Xr;
Xr = temp;
}
/* Exchange Xl and Xr */
temp = Xl;
Xl = Xr;
Xr = temp;
Xr = Xr ^ P[1];
Xl = Xl ^ P[0];
*xl = Xl;
*xr = Xr;
}
short InitializeBlowfish(char key[], short keybytes)
{
short i;
short j;
short k;
short error;
short numread;
unsigned long data;
unsigned long datal;
unsigned long datar;
/* First, open the file containing the array initialization data */
error = opensubkeyfile();
if (error == noErr) {
for (i = 0; i < N + 2; ++i) {
numread = fread(&data, 4, 1, SubkeyFile);
#ifdef little_endian /* Eg: Intel We want to process things in byte */
/* order, not as rearranged in a longword */
data = ((data & 0xFF000000) >> 24) |
((data & 0x00FF0000) >> 8) |
((data & 0x0000FF00) << 8) |
((data & 0x000000FF) << 24);
#endif
if (numread != 1) {
return DATAERROR;
} else {
P[i] = data;
}
}
for (i = 0; i < 4; ++i) {
for (j = 0; j < 256; ++j) {
numread = fread(&data, 4, 1, SubkeyFile);
#ifdef little_endian /* Eg: Intel We want to process things in byte */
/* order, not as rearranged in a longword */
data = ((data & 0xFF000000) >> 24) |
((data & 0x00FF0000) >> 8) |
((data & 0x0000FF00) << 8) |
((data & 0x000000FF) << 24);
#endif
if (numread != 1) {
return DATAERROR;
} else {
S[i][j] = data;
}
}
}
fclose(SubkeyFile);
j = 0;
for (i = 0; i < N + 2; ++i) {
data = 0x00000000;
for (k = 0; k < 4; ++k) {
data = (data << 8) | key[j];
j = j + 1;
if (j >= keybytes) {
j = 0;
}
}
P[i] = P[i] ^ data;
}
datal = 0x00000000;
datar = 0x00000000;
for (i = 0; i < N + 2; i += 2) {
Blowfish_encipher(&datal, &datar);
P[i] = datal;
P[i + 1] = datar;
}
for (i = 0; i < 4; ++i) {
for (j = 0; j < 256; j += 2) {
Blowfish_encipher(&datal, &datar);
S[i][j] = datal;
S[i][j + 1] = datar;
}
}
} else {
printf("Unable to open subkey initialization file : %d\n", error);
}
return error;
}
۲-۲ سیستمهای کلید نامتقارن
سیستمهای کلید نامتقارن از کلید مختلفی برای رمزنگاری و رمزگشایی استفاده میکنند. بسیاری از سیستمها اجازه میدهند که یک جزء (کلید عمومی یا public key) منتشر شود در حالیکه دیگری (کلید اختصاصی یا private key) توسط صاحبش حفظ شود. فرستنده پیام، متن را با کلید عمومی گیرنده کد میکند و گیرنده آن را با کلید اختصاصی خودش رمزنگاری میکند. بعبارتی تنها با کلید اختصاصی گیرنده میتوان متن کد شده را به متن اولیه صحیح تبدیل کرد. یعنی حتی فرستنده نیز اگرچه از محتوای اصلی پیام مطلع است اما نمیتواند از متن کدشده به متن اصلی دست یابد، بنابراین پیام کدشده برای هرگیرندهای بجز گیرنده مورد نظر فرستنده بیمعنی خواهد بود. معمولترین سیستم نامتقارن بعنوان RSA شناخته میشود (حروف اول پدیدآورندگان آن یعنی Rivest ، Shamir و Adlemen است). اگرچه چندین طرح دیگر وجود دارند. میتوان از یک سیستم نامتقارن برای نشاندادن اینکه فرستنده پیام همان شخصی است که ادعا میکند استفاده کرد که این عمل اصطلاحا امضاء نام دارد. RSA شامل دو تبدیل است که هرکدام احتیاج به بتوانرسانی ماجولار با توانهای خیلی طولانی دارد:
• امضاء، متن اصلی را با استفاده از کلید اختصاصی رمز میکند؛
• رمزگشایی عملیات مشابهای روی متن رمزشده اما با استفاده از کلید عمومی است. برای تایید امضاء بررسی میکنیم که آیا این نتیجه با دیتای اولیه یکسان است؛ اگر اینگونه است، امضاء توسط کلید اختصاصی متناظر رمزشده است.
به بیان سادهتر چنانچه متنی از شخصی برای دیگران منتشر شود، این متن شامل متن اصلی و همان متن اما رمز شده توسط کلید اختصاصی همان شخص است. حال اگر متن رمزشده توسط کلید عمومی آن شخص که شما از آن مطلعید رمزگشایی شود، مطابقت متن حاصل و متن اصلی نشاندهنده صحت فرد فرستنده آن است، به این ترتیب امضای فرد تصدیق میشود. افرادی که از کلید اختصاصی این فرد اطلاع ندارند قادر به ایجاد متن رمزشده نیستند بطوریکه با رمزگشایی توسط کلید عمومی این فرد به متن اولیه تبدیل شود.
اساس سیستم RSA این فرمول است: X = Y k (mod r)
که X متن کد شده، Y متن اصلی، k کلید اختصاصی و r حاصلضرب دو عدد اولیه بزرگ است که با دقت انتخاب شدهاند. برای اطلاع از جزئیات بیشتر میتوان به مراجعی که در این زمینه وجود دارد رجوع کرد. این شکل محاسبات روی پردازندههای بایتی بخصوص روی ۸ بیتیها که در کارتهای هوشمند استفاده میشود بسیار کند است. بنابراین، اگرچه RSA هم تصدیق هویت و هم رمزنگاری را ممکن میسازد، در اصل برای تایید هویت منبع پیام از این الگوریتم در کارتهای هوشمند استفاده میشود و برای نشاندادن عدم تغییر پیام در طول ارسال و رمزنگاری کلیدهای آتی استفاده میشود.