پروژه تئوری رمز گذاری

مقدمه و تاریخچه

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

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

توجه داشته باشید که رمزنگاری به تغییر ساده محتویات یک متن گفته می‌شود با کدگذاری (coding) تفاوت دارد. در این صورت تنها هر کاراکتر با یک نماد تغییر می‌کند. کلمه Cryptography بر گرفته لغات یونانی‘kryptos’ به مفهوم ” محرمانه ” و grapheinبه معنای نوشتن ” است. قبل از هر چیز لازم است بین رمز و کد تفاوت قائل شویم. رمز به مفهوم تبدیل کاراکتر به کاراکتر یا بیت به بیت ؛ بدون تغییر محتویات زبان شناختی آن است. در مقابل ” کد ” تبدیلی است که کلمه‌ای را با یک کلمه یا نماد دیگر جایگزین می‌کند .
دانش رمزنگاری بر پایه مقدمات بسیاری از قبیل تئوری اطلاعات، نظریه اعداد و آمار بنا شده‌است.امروزه در کشور ما نیز دوره دکترای رمزنگاری که از شاخه های رشته ریاضی کاربردی میباشد برگزار میشود.

شروع و توسعه رمزنگاری
اولین بار سزار امپراتور رم باستان برای آنکه بتواند بدون اطلاع دشمن با ا ارتشش در سراسر دنیا در ارتباط باشد نوعی رمز را بکار گرفت. این رمز به این شکل بود که برای فرستادن یک پیام جای هر حرف را با سومین حرف بعد از آن در الفبا عوض می کردند، مثلا به جای ‘A’ حرف ‘D’ و به جای ‘X’ حرف ‘A’ را می گذاشتند.

بنابراین برای از کد خارج کردن پیام ها کافی بود دریافت کننده جای هر حرف را با سومین حرف بعد از آن در الفبا عوض کند. مثلا سعی کنید این پیغام سزاری را از رمز خارج کنید:
hqhpb dssurdfklqj
wkluwb ghdg

uhwuhdw wr iruhvw

در این کدگذاری ریاضی زمانی مطرح می شود که به هر حرف یک عدد نسبت دهیم. در این صورت فرایند کد کردن مثل اضافه کردن عدد ۳ به عدد اولیه خواهد بود

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’ : داریم ۰+۳=۳
برای اینکه در مورد حرف های نزدیک به پایان الفبا دچار مشکل نشویم بهتر است به جای جمع معمولی از جمع به پیمانه ۲۶ استفاده کنیم، یعنی به جای هر عدد از باقیمانده تقسیم آن عدد بر ۲۶ استفاده کنیم.
مثلا:
برای ‘X’ داریم: (به پیمانه ۲۶) ۲۳+۳=۲۶=۰

برای ‘Y’ داریم: (به پیمانه ۲۶) ۲۴+۳=۲۷=۱

برای ‘T’ داریم: (به پیمانه ۲۶) ۱۹+۳=۲۱=۲۱

برای از رمز درآوردن هم می توانیم از تفریق به پیمانه ۲۶ استفاده کنیم. واضح است که می توانیم به جای انتقال ۳ تایی از هر انتقالی بین ۱ و ۲۵ استفاده کنیم، اما همانطور که احتمالا حدس زده اید شکستن این رمز خیلی ساده است یعنی یک جاسوس می تواند با امتحان کردن همه ۲۵ انتقال ممکن به سرعت رمز را بشکند.
حالا به سراغ یک روش پیچیده تر می رویم. فرض کنید به ازای هر حرف الفبا یک علامت جایگزین کنیم، مثلا ‘*’ به جای ‘A’ و ‘+’ به جای ‘B’. مثل رمزی که ماری ملکه اسکاتلند برای مکاتباتش بر علیه الیزابت اول ملکه انگلیس بکار می گرفت .

تا مدت ها مردم فکر می کردند شکستن این رمز ناممکن است تا اینکه آمار ریاضی بوجود آمد .

نموداری که می بینید فراوانی حروف الفبا را در زبان انگلیسی نشان میدهد.

این اطلاعات از شمارش حروف مختلف در حجم زیادی از نوشته ها مثل کتاب ها و روزنامه ها بدست آمده است. این نمودار مثلا نشان می دهد به طور میانگین ۱۳٫۵ درصد از حروف بکار رفته در متن های انگلیسی E هستند، که فراوان ترین حرف الفبا است. بنابراین وقتی رمزی از نوع بالا داریم احتمالا علامتی که بیش از همه تکرار می شود علامت متناظر E است و فراوانترین علامت بعد از آن متناظر ‘T’ است. سرنخ های دیگری هم وجود دارد مثلا تنها دو کلمه یک حرفی در انگلیسی وجود دارد: ‘I’ و ‘A’ و همچنین ‘AND’ و ‘THE’ کلمات خیلی معمولی هستند با کمک این سرنخ ها و کمی آزمایش و خطا میتوان اینگونه رمزها را شکست.همین روش باعث شد که ماری سرش را از دست بدهد.

 

براساس متون موجود در مورد رمزنگاري تاريخچه اين علم را میتوان در نگاهي گذرا بصورت زير بيان كرد :
۱ – شروع رمزنگاري به سال ۱۹۰۰ قبل از ميلاد برميگردد برطبق اساد موجود يك مصري درآن زمان كه كلمات بصورت تصوير بيان ميشد ازتصاويري استفاده كرده كه متداول نبوده بنابراين شروع رمزنگاري از مصريان ميباشد . چهارصد سال بعد در بينالنهرين وحه هئي نوشته شد كه شامل فرمولهائي رمزي از تهيه شيشه براي كوزه گري ميباشد .
۲ – ۵۰۰ سال قبل از ميلاد يك نويسنده يهودي كتابي نوشت كه كلمات آن برعكس نوشته شده بود اين روش بنام رمز آتابش ناميده شد .

۳ – در سال ۴۸۷ قبل از ميلاد اسكيتال در يونان بوجود آمد و مورد استفاده قرار گرفت
۴ – ۴۰۰ سال بعد ژوليوس سزار در مكاتبات دولتي از رمز سزار استفاده كرد . او در اين رمز جاي حروف الفبا را عوض كرد . رمز سزار هرچند در نسبت به رمز آتابش ساده تر است اما مدارك محرمانه دولتي در نگاه اول قابل فهميدن نبود .

۵ – بين سالهاي ۰ تا ۴۰۰ بعد از ميلاد رمز به عنوان يك هنر توسط هنديان در كاماسوترا بيان شده است . در كاما سوترا به شيوه هاي ساده رمزنگاري اشاره شده است .
۶ – ۲۰۰ سال بعد از ميلاد ليدن دستورالعمل هاي مهم خود را بصورت رمز مي نوشت .

۷ – در شروع امپراتوري اسلامي ابوعبدل الرحمان الخليل ابن احمد امرابن تمام الفرهادي الزيدي اليهمدي كتابي در علم رمزنگاري نوشت كه الهام گرفته از رمزهاي يوناني ميباشد كه براي امپراتوري روم شرقي نوشته شده بود . البته اين كتاب مفقود شده است شيوه هائي كه در اين كتاب اشاره شده است در جنگ جهاني دوم در مقابل رمز انگما نيز استفاده شده است .

۸ – در سال ۸۵۵ ابوبكر احمد ابن علي ابن وحششيه نباتي رمزهاي مختلفي را ابداع كرده تست ۹ – در حكومت غزنويان كه كشورگشائي هاي زيادي داشتند در بحث نظامي و سفارت خانه اي خود به وفور از رمزها استفاده مي كردند .مقامات عاليرتبه حكومتي با توجه به موقعيتشان از سيستم رمز مخصوص آن مقام استفاده مي كردند .
۱۰ – در سالهاي بعد از ۱۲۶۶ ( بعد از ميلاد ) در ونيز رمزهائي ساده در عالم سياست استفاده مي شد . در اين رمز جاي حروف با نقطه و ضريبدر عوض مي شد .
۱۱ – در حدود ۱۵۰۰ ( بعد از ميلاد ) شخصي بنام روگر بكن رمزهاي متعددي را نوشت او در اول كارهايش مينويسد . : كسي كه متن محرمانه اي را طوري بنويسد كه بقيه بفهمند احمق مي باشد .

۱۲ – در ۱۳۰۰ ميلادي ابن خلدون جهت استفاده اداره ماليات و ارتش براي ساده نويسي و پنهان كاري از نوعي رمز استفاده مي كرد .
۱۳ – در سالهاي بعد از ۱۳۷۹ ميلادي گابريل دي لاوندي بتقاضلي كلمنت هفتم رمزي نوشت كه تركيبي از جابجائي حروف و كدها بود اين رمز سالها مورد استفاده دولتمردان قرارگرفت و تا ۴۰۰ سال اين رمز كاربرد داشت .

۱۴ – جوفري چاوسر در سالهاي ۱۳۹۲ رمزي نوشت كه تركيبي از علائم و جابجائي حروف و كد بود
۱۵ – در ۱۴۱۲ ميلادي عابد الله الكلكشندي دائره المعارفي عربي نوشت كه ۱۴ جلد مي باشد و يكي از جلد هاي آن مربوط به رمزنگاري و منصوب به طالب موصولي مي باشد . او براي اولين بار ؛ چند بار از جانشاني استفاده مي كند او در كتاب خود راجع به رمزگشائي نيز بحث مي كند كه رمز شكني با استفاده از روش فركانسي منصوب به او مي باشد .
۱۶ – در سال ۱۴۶۶ اون باتيستا البرتي رمزي را اختراع كرد كه امروزه به رمز ( Capital Midnight Decode Badge ) مشهور است براي نزديك به ۴۰۰ سال يعني تا ۱۸۰۰ اين رمز شكسته نشد

۱۷ – در ۱۵۱۸ اولين كتاب چاپي در باره رمز توسط جوهان تريتيميوس نوشته شده او در اني كتاب از رمزهاي مختلف سخن ميگويد او از رمز polyalphabetic با شيوه جانشاني مستطيلي را توضيح مي دهد .

۱۸ – جيوان باتيستاپورتا در سال ۱۵۵۳ رمزي را ابداع كرد كه در آن ازيك عبارت بعنوان كليد استفاده مي شود بسياري از نويسندگان اين رمزبلاسو را با رمز ويگنر اشتباه ميگيرند .
۱۹ – جيواني باتيستا پورتا در سال ۱۵۶۳ از رمزي استفاده كرد كه در آن رمز ضمن استفاده از اسپل غلط و در ضمن جانشاني و انتقال از حروف عجيب و غريب در متن هاي خود استفاده كرد .

۲۰ – در سال ۱۵۸۵ بلاليسس دي ويگنر كتابي در مورد رمز نوشت با متنهاي رمزي همراه با سيستم رمز كليد خودكار ( يعني كليد رمز در متن قبلي قرار دارد . اين سيستم بعد ها در رمزهاي DES,CFB,CBC مورد استفاده قرار گرفت .
۲۱ – در سال ۱۶۲۳ فرانسيس بيكن رمزي بنام رمز كننده ۵ – بيتي باينري را ابداع كرد .
۲۲ – توماس جفرسون در سال ۱۷۹۰ با كمك دكتر جفرسون ( رياضي دان ) چرخ رمز را اختراع كردند . اين رمز تكامل پيدا كرد و بعدها در جنگ جهاني دوم مورد استفاده قرار گرفت .
۲۳ – در سال ۱۸۱۷ سرهنگ وادستورد ديسكهاي چرخدنده هاي رمز كننده اي با تعداد حروف متفاوت را اختراع كرد

۲۴ – چارلز ويتستون رمز ( بازي مطبوع ) را در ۱۸۵۴ اختراع كرد . او همچنين رمز وادستورد را تكميل كرد .
۲۵ – اختراع تكامل يافته چرخ رمز نگاري توسط چارلز بابگي در ۱۸۵۴
۲۶ – در ۱۸۵۷ ادميرال سرفرانسيس بيوفورت رمز جديدي اختراع كرد كه نوعي رمز ويگنر مي باشد . البته كار او س از مرگش توسط برادرش چاپ شد .
۲۷ – پليني چاسي اولين شرح را براي رمزهاي توموگرافيك در ۱۸۵۹ نوشت .

۲۸ – بين سالهاي ۱۸۶۱ الي ۱۹۸۰ بحث رمز عمومي شد و در سال ۱۷۶۹ سندي در امريكا بدست امده كه بنحوي با رمز سروكار دارد .
۲۹ – در ۱۸۶۱ فردريك كاساسكي كتابي نوشت برچگونگي شكستن رمز چند الفبائي كه چند صد سال امن مانده بود
۳۰ – در جنگهاي داخلي امريكا جنوبي ها از جانشين كردن حروف در متن رمزي استفاده كردند درصورتي كه شمالي ها از رمز ويگنر كه بتازگي از طرف كاساسكي ابداع شده بود استفاده مي كردند .

۳۱ – در ۱۸۹۱ سرهنگ اتيني بازرايز بعد از انكه مدل جديد چرخ رمزكننده را ابداع كرد و ارتش فرانسه از آن استقبال نكرد آن انتشار داد
۳۲ – كاپيتان پاركت هيت در سال ۱۹۱۳ با تغيير در چرخ رمز كننده منجر به رمز كننده M-138-A از WW-II شد .
۳۳ – در سال سال ۱۹۱۶ سرتيپ ژوزف مورجني رمز هيت را بصورت چرخ رمزي درآورد و جايگزيني حروف را قويتر انجام داد و در نهايت منجر به دستكاه رمز كننده M-94 شد .
۳۴ – در ۹۱۷ ويليام فردريك فايردمن كه پدر علم رمز امريكا ناميده مي شود در دولت محلي ريوربنك امريكا بعنوان متخصص رمز استخدام شد و اولين مركز آموزشي رمز را براي ارتش آمريكا ايجاد كرد و بعدها به خاطر فعاليتش به واشنگتن رفت .

۳۵ – در همين سال گيلبرت ورنام رمزي را ابداع نمود كه كاملا” از كليدهاي اتفاقي استفاده مي شد كه ديگر تكرار نمي شد تا اين تاريخ اين اولين ماشين رمزكننده اي است كه به ثبت رسيده است . رمز او براي استفاده در جنگ جهاني اول پيشنهاد شد ولي ارتش امريكا آن را نپذيرفت و در كارهاي بازرگاني بكار گرفته شد .
۳۶ – در اواخر جنگ جهاني اول آلمانها سيستم رمز كننده ADFGVX را اختراع كردند كه توسط رمز شكن مشهور فرانسوي پينوين شكسته شد .
۳۷ – در ۱۹۱۹ الكساندر كوخ رمز استوانه اي را ابداع كرد كه در ۱۹۲۷ امتياز رمز را به ارتور اسچربيوس كه مخترع ماشين انيگما بود واگذار كرد .
۳۸ – در سوئد گرهارد دراما رمز استوانه اي را ابداع نمود كه بعدها توسط وايلهلم هگالين به مجموعه اي از رمز مشهور شد . بعدها دولت سوئد در ۱۹۱۹ پيشنهاد كرد شركتي كه شركتي با نام CryptoAG تاسيس گردد و دولت نيز در موارد مربوط به رمز از آن شركت استفاده كند . اين شر۳۹ – در ۱۹۲۱ ادوارد هوگ هيرن كد هاي الكتريكي را ابداع نمود . كه در حال حاضر نيز فعال است و بخاطر فروش رمز كننده به ايران مورد چالش قرار گرفت .

۳۹ – تا سال ۱۹۲۴ رمز وون كريا كه به شدت مورد استفاده دپيماتهاي آلماني قرار مي گرفت توسط رمز شكنان امريكائي در مدت دو ساعت و چهل دقيقه شكسته شد و بعد از اين تاريخ ديگر مورد استفاده قرار نگرفت .

۴۰ – از سال ۱۹۲۵ به بعد كاربران رمز از بانكها . نيرو هاي مسلح و عاشقان . مورد استفاده خلافكاران نيز قرار گرفت بطوري كه در اداره رمز در واشنگتن دي سي امريكا گشايش يافت .
۴۱ – بين سالهاي ۱۹۲۷ الي ۱۹۳۳ يكي از بازنشستگان نيروي دريائي آمريكا كه نام او مشخص نشد شبكه رمزي قوي ايجاد كه كه مورد استفاده وسيع اچاقچيان قرار گرفت و بسياري از رمزهاي انان شكسته نشد .

۴۲ – لستر هيل در ۱۹۲۹ مقاله زيبائي تحت عنوان ” رمز نگاري در جبر حروف انتشار داد در اين رمز از ماتريسها جهت رمز كردن استفاده مي شود .
۴۳ – بين سالهاي ۱۹۳۳ تا ۱۹۴۵ رمز انگما كه به المان برده شده بود و تكامل پيدا كرد و مورد استفاده المانها قرار گرفت توسط يك رياضدان لهستاني به نام مارين رجوسكي شكسته شد . اين رمز در جنگ جهاني در انگليس هم توسط آلن ترنينگو و گردن ريچمن شكسته شد .
۴۴ – در همين ايام رمز ژاپني ها توسط هربرت ياردلي شكسته شد و ژاپنيس ها رمز ارغواني را ابداع كردند اين رمز نيز توسط گروهي به سركردگي ويليام فريدمن شكسته شد .
۴۵ – اختراع رمز كننده SIGABA_131_C در سال ۱۹۳۰ به ويليام فايردمن نسبت داده مي شود . اين رمز كننده كامل تر از رمز كننده انيگما مي باشد . و داراي پانزده استوانه براي انتقال رقم ها و نج استوانه براي كنترل باند مي باشد .

۴۶ – در سال ۱۹۳۰ رمز كننده Typex جايگزين رمز كننده انيگما مي شود .
۴۷ – در سال ۱۹۷۰ دكتر هورست فيستال در يك پروژه تحقيقاتي روز رمزها مجموعه اي از رمزرمز ها را بوجود آورد كه منجر به رمز كننده DES گرديد .
۴۸ – در سال ۱۹۷۶ در شركت IBM طراحي رمزي براساس رمز ليسوفر به نام رمز FIPS PUB 46 انجام گرفت كه داراي S – BOX پيشرفته و همچنين كاهش اندازه كليد را دربرداشت . و براي بيست سال در برار حملات مقاومت كرد . و بدين خاطر بسيار مورد استفاده قرار گرفت .

۴۹ – در سال ۱۹۷۶ وايت فيلد ديفي و مارتين هلمن براي اولين بار در مقاله خويش كليد عمومي را معرفي كرد .
۵۰ – در سال ۱۹۷۷ براساس مقاله هلمن سه ماتور كار رمز بنامهاي رونالد ريوست . عدي شامير و لئونارد ادلمن رمز RSA ابداع كردند . در اوليل كار سازمان NSA امريكا اجازه نداد كه كار انها انتشار پيدا كند ولي بعد از مدتي كار خود را انتشار دادند كه همزمان با انتشار دو ژورنال Cryptologia و Cryptology مي باشد . در واقع اين سه نفر مقاله هلمن را عملي كردند .
۵۱ – در سال ۱۹۷۸ در ACM براي اولين بار RSA انتشار يافت
۵۲ – در ۱۹۸۴ الي ۱۹۸۵ رمز ROT13 در خبرنامه USENET انتشار يافت .
۵۳ – در ۱۹۹۰ جيمز مسي وليي در سيوزرلند رمز هاي بلوكي استاندارد را كه به دليل استفاده ساده تر جاي رمز DES را گرفت با نام IDEA ابداع كرد .
۵۴ – براي اولين بار در ۱۹۹۱ رمز كوانتومي توسط بنتووبراساد مطرح شد . آنها از يك فوتون جهت انتقال كليد استفاده كردند در اين رمز كننده گيرنده و فرستنده بايد داراي كابل فيبر اپتيكي باشند

۵۵ – در همين سال زيمرمن رمز PGP را براي اولين بار معرفي كرد اين رمز به دليل سادگي و امنيت بالا مورد استفاده جهاني قرار گرفته است .
۵۶ – در سال ۱۹۹۴ پروفسور رون ريوست به دنبال ابداع 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 نام دارد و از سال ۱۹۷۶ مورد استفاده قرار گرفته است. تكنيك DES در واقع يك متن كدشدهِ تكراري است كه به قطعات ۶۴ بيتي متن ساده متصل مي‌شود.

تابع رمزگذاري به‌ واسطه جابه‌جايي، توسعه، انتقال، فشرده‌سازي، تعويض و تركيب قطعات ۶۴ بيتي متن پيغام با يك كليد ۵۶ بيتي، هر قطعه از متن ورودي را به يك قطعه متن ۶۴ بيتي كدشده تبديل مي‌كند. گيرنده پيغام، با اجراي معكوس مراحل رمزگذاري و با استفاده از همان كليد ۵۶ بيتيk ، قادر است پيغام را به حالت اوليه بازگرداند.

شکل۱- فرآيند رمزگذاري از فرمول (C=E(P تبعيت مي‌کند. براي رمزگشايي پيغام از فرمول (P=D(C استفاده مي‌شود. در رمزگذاري به شيوه کليد متقارن،
رابطه K1=K2 برقرار است. در رمزگذاري به شيوه کليد عمومي، کليد رمزگذاري با کليد عمومي دريافت‌کننده پيغام يکسان است و کليد رمزگشايي همان کليد خصوصي دريافت‌کننده است.

تكنيك DES از همان ابتداي كار، به عنوان يك روش ايمن براي انجام تراكنش‌هاي مالي مورد استفاده قرار گرفت، اما امروزه كارايي گذشته را ندارد. فضاي ۵۶ بيتي كليد مورد استفاده در اين تكنيك، ۲ به توان ۵۶ كليد منحصر به‌فرد توليد مي‌كند. بنابراين، جست‌وجوي دقيق فضاي كليد، متضمن دستيابي به مقدار كليدk و تبديل متن كدشدهC به پيغام اوليه P خواهد بود.
با اين‌كه فضاي ۲۵۶ بيتي براي انسان‌ها بسيار بزرگ به ‌نظر مي‌رسد، جست‌وجوي آن براي ماشين‌هاي ويژهِ كشف‌رمز يا سوپركامپيوترهاي امروزي، چندان مشكل نيست. در نتيجه، محققان روش‌هاي جديدي را براي پياده‌سازي الگوريتم‌هاي رمزنگاري به‌شيوه كليد متقارن ابداع كرده‌اند.

از ميان اين روش‌ها مي‌توان از DES سه‌گانه (در اين روش، تكنيك DES سه بار پياپي و با استفاده از سه كليد ۵۶ بيتي متفاوت اجرا مي‌شود. در اين نوع رمزنگاري، فضاي كليد مود استفاده، معادل يك كليد ۱۶۸ بيتي خواهد بود.)، تكنيك IDEA يا International Data Encryption Algorithm با كليدهاي ۱۲۸ بيتي، تكنيك RC4 (كليدهايي با فضاي بالاي دو كيلوبيت يا ۲۰۴۸ بيت) و تكنيك RC5 (كليدهايي با فضاي بالاي ۲۵۶ بيت) نام برد.

هنگام استانداردسازي روش‌هاي رمزنگاري در سال ۱۹۹۷ مؤسسه ملي استاندارد و فناوري با برگزاري يك مسابقه عمومي، تكنيك DES را با تكنيك AES يا Advanced Encription Standard جايگزين كرد. برنده اين مسابقه روشي موسوم به Rijndael يا Rhine-doll بود كه دو رمزنگار بلژيكي معرفي كردند.

تكنيك AES مانند DES نوعي رمزنگاري با استفاده از قطعات تكراري متن كدشده است، اما در آن از متن‌هاي ۱۲۸ بيتي همراه كليدهاي ۱۲۸، ۱۹۲ يا ۲۵۶بيتي استفاده مي‌شود. بهره‌گيري از كليد ۲۵۶ بيتي، تعداد ۲ به توان ۲۵۶ انتخاب را براي كليد فراهم مي‌كند. جست‌وجوي اين فضا حتي براي كامپيوترهاي پيشرفتهِ امروزي نيز غيرممكن است.
از آنجايي كه براي اجراي رمزنگاري به شيوه كليد متقارن از فرمول‌هاي رياضي ساده استفاده مي‌شود، اين شيوه با سرعت نسبتاً زيادي به اجرا در مي‌آيد. صرف‌نظر از فضاي كليد، تمام رويكردهاي رمزنگاري به شيوه كليد متقارن يك ضعف مشابه دارند. براي بازگرداندن پيغام به حالت اوليه، كليد مورد استفاده در رمزگذاري بايد در اختيار دريافت‌كننده پيغام قرار بگيرد. در اين بين اگر كسي به كليد دسترسي يابد، رمزنگاري پيغام بي‌فايده خواهد بود. براي رفع مشكل انتقال كليد، مي‌توان از رمزنگاري به شيوه كليد عمومي بهره گرفت.
الگوریتم رمزنگاری قابل بازگشت (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 ، ۱۶ بایتی و متغیر iv ، ۲۴ بایتی که به عنوان کلید عمومی و کلید اختصاصی استفاده می شوند.
الگوريتم رمزنگاري BlowFish :
الگوريتم رمزنگاري متقارن BlowFish يكي از روشهاي متداول رمزنگاري است . اين الگوريتم با پذيرش كليد عمومي از ۳۲ بيت تا ۴۴۸ بيت ، جايگزين خوبي براي روشهائي مثل DES است . ( خصوصا در كشورهائي مثل آمريكا كه صدور و فروش نرم افزارهاي داراي سيستم رمزنگاري به خارج از كشور ممنوع و براي استفاده هاي داخلي هم در طول كليد محدوديتهائي وجود دارد.)
از اين روش امروزه به وفور در نرم افزارهاي گسترده و سازماني استفاده ميشه ، به عنوان مثال Oracle . اين الگوريتم در سال ۱۹۹۳ توسط 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 هم تصدیق هویت و هم رمزنگاری را ممکن می‌سازد، در اصل برای تایید هویت منبع پیام از این الگوریتم در کارتهای هوشمند استفاده می‌شود و برای نشاندادن عدم تغییر پیام در طول ارسال و رمزنگاری کلیدهای آتی استفاده می‌شود.