رمزنگاري دانش تغيير دادن متن پيام به کمک يک کليد رمزنگاري و يک الگوريتم رمزنگاري است. به صورتي که تنها شخصي که از کليد و الگوريتم مطلع است قادر به استخراج متن اصلي از متن رمزشده باشد و شخصي که از يکي يا هردوي آنها اطلاعي ندارد، نتواند به محتواي پيام دسترسي پيدا کند. رمزنگاري از طريق پنهان نگاه داشتن الگوريتم منسوخ است. در روشهاي جديد رمزنگاري فرض بر آن است که همگان الگوريتم را ميدانند. آنچه پنهان است فقط کليد است.
رمزنگاري علمي است که به وسيله آن ميتوان اطلاعات را بصورتي امن منتقل کرد حتي اگر مسير انتقال اطلاعات (کانالهاي ارتباطي) ناامن باشد. دريافتکننده اطلاعات آنها را از حالت رمز خارج ميکند (decrypting). به اين عمل در واقع رمزگشايي گفته ميشود .
توجه داشته باشيد که رمزنگاري به تغيير ساده محتويات يک متن گفته ميشود با کدگذاري (coding) تفاوت دارد. در اين صورت تنها هر کاراکتر با يک نماد تغيير ميکند. کلمه Cryptography بر گرفته لغات يوناني‘kryptos’ به مفهوم ” محرمانه ” و grapheinبه معناي نوشتن ” است. قبل از هر چيز لازم است بين رمز و کد تفاوت قايل شويم. رمز به مفهوم تبديل کاراکتر به کاراکتر يا بيت به بيت ؛ بدون تغيير محتويات زبان شناختي آن است. در مقابل ” کد ” تبديلي است که کلمهاي را با يک کلمه يا نماد ديگر جايگزين ميکند . در بررسي نخستين استفاده کنندگان از رمزنگاري به ” سزار ” امپراتور روم و نيز ” الکندي ” که يک مسلمان است برميخوريم از عمده ترين شيوههاي رمزنگاريهاي ابتدايي پيچيدن نسخه اصلي پيام بر روي استوانهاي با قطر مشخص و نوشتن پيام بر روي متن استوانهاي است. بديهي است بدون درک ميزان قطر، خواندن پيام کار بسيار دشواري بود بعدها از اين روش به همراه موتورهاي الکتريکي براي رمزنگاري استفاده شد. در ادامه تصاويري از اين رمزنگاري را مشاهده ميکنيد .
رمزنگاري امروزه به طور خاص در علم مخابرات مورد استفاده قرار ميگيرد. از رمزنگاري ميتوان براي تأمين امنيت و تأمين اعتبار پيام به صورت جداگانه يا توامان استفاده کرد. منظور از تأمين امنيت پيام اين است که به غير از گيرنده مجاز، شخص ديگر قادر به فهميدن متن پيام نباشد. همچنين منظور از اعتبار پيام اين است که فرستنده واقعي پيام مشخص باشد. دانش رمزنگاري بر پايه مقدمات بسياري از قبيل تيوري اطلاعات، نظريه اعداد و آمار بنا شدهاست.
الگوريتمهاي مختلفي (مانند md5 و RSA) براي رمز کردن اطلاعات وجود دارد.
1 - معرفي رمزگذاري
رمزگذاري يعني تبديل اطلاعات به يک شکل غير قابل فهم و انتقال آن و سپس برگرداندن اطلاعات رمز شده به حالت اوليه و قابل خواندن. عناصر مهمي که در رمزگذاري مورد استفاده قرار ميگيرند به شرح زير ميباشد:
1.1 Public Key يا کليد عمومي اعداد يا کلماتي که با يک شخص يا سازمان در ارتباط ميباشد. کليد عمومي جزيي از جفت کليد عمومي/خصوصي ميباشد وبه صورت عمومي در دسترس کساني که قصد انتقال اطلاعات رمز شده را دارند، ميباشد.
1.2 Private Key يا کليد خصوصي اعداد يا کلماتي که با يک شخص يا سازمان در ارتباط ميباشد. کليد خصوصي جزيي از جفت کليد عمومي/خصوصي ميباشد. کليد خصوصي فقط در دسترس مالک جفت کليد عمومي/خصوصي ميباشد و براي بازگشايي اطلاعاتي که توسط کليد عمومي رمزگذاري شده استفاده ميشود.
1.3 ايجادکنندههاي جفت کليد براي ايجاد يک جفت کليد عمومي و خصوصي طبق يک الگوريتم رمزگذاري مشخص استفاده ميشود.
1.4 Key Factories براي تبديل کليدهاي نامشخص به کليدهاي مشخص به کار ميرود.
1.5 Keystores بانکي که براي مديريت تعدادي از کليدها به کار ميرود.
1.6 الگوريتمهاي رمزگذاري الگوريتمها و روشهايي که براي رمزگذاري اطلاعات به کار ميرود. RSA و DES نام دو تا از معروفترين الگوريتمها ميباشد.
2 - روشهاي رمزگذاري
2.1 - روش متقارن Symmetric در اين روش هر دو طرفي که قصد رد و بدل اطلاعات را دارند از يک کليد مشترک براي رمزگذاري و نيز بازگشايي رمز استفاده ميکنند.در اين حالت بازگشايي و رمزگذاري اطلاعات دو فرآيند معکوس يکديگر ميباشند. مشکل اصلي اين روش اين است که کليد مربوط به رمزگذاري بايد بين دو طرف به اشتراک گذاشته شود و اين سوال پيش ميآيد که دو طرف چگونه ميتوانند اين کليد را به طور امن بين يکديگر رد و بدل کنند. انتقال از طريق انترانت و يا به صورت فيزيکي تا حدي امن ميباشد اما در انتقال آن در اينترنت به هيچ وجه درست نيست.در اين قبيل سيستمها، کليدهاي رمزنگاري و رمزگشايي يکسان هستند و يا رابطهاي بسيار ساده با هم دارند .اين سيستمها را سيستمهاي متقارن يا ” تک کليدي ” ميناميم. به دليل ويژگي ذاتي تقارن کليد رمزنگاري و رمزگشايي، مراقبت و جلوگيري از افشاي اين سيستمها يا تلاش در جهت امن ساخت آنها لازم است در بر گيرنده ” جلوگيري از استراق سمع ” و ” ممانعت از دستکاري اطلاعات ” باشد .
2.2 - روش نامتقارن Asymmetric اين روش براي حل مشکل انتقال کليد در روش متقارن ايجاد شد. در اين روش به جاي يک کليد مشترک از يک جفت کليد به نامهاي کليد عمومي و خصوصي استفاده ميشود. در اين روش از کليد عمومي براي رمزگذاري اطلاعات استفاده ميشود. طرفي که قصد انتقال اطلاعات را به صورت رمزگذاري شده دارد اطلاعات را رمزگذاري کرده و براي طرفي که مالک اين جفت کليد است استفاده ميشود. مالک کليد، کليد خصوصي را پيش خود به صورت محرمانه حفظ ميکند. در اين دسته، کليدهاي رمزنگاري و رمزگشايي متمايزند و يا اينکه چنان رابطه پيچيدهاي بين آنها حکم فرماست که کشف کليد رمزگشايي با در اختيار داشتن کليد رمزنگاري، عملا ناممکن است.
2.3 -مقايسه رمزنگاري الگوريتمهاي متقارن و الگوريتمهاي کليد عمومي: بحثهاي زيادي شده که کدام يک از اين الگوريتمها بهترند اما جواب مشخصي ندارد. البته بررسي هايي روي اين سوال شده به طور مثال Needham و Schroeder بعد از تحقيق به اين نتيجه رسيدند که طول پيغامي که با الگوريتمهاي متقارن ميتواند رمزنگاري شود از الگوريتمهاي کليد عمومي کمتر است. و با تحقيق به اين نتيجه ريسيدند که الگوريتمهاي متقارن الگوريتمهاي بهينه تري هستند. اما وقتي که بحث امنيت پيش مي آيد الگوريتمهاي کليد عمومي کارايي بيشتريدارند. و بطور خلاصه ميتوان گفت که الگوريتمهاي متقارن داراي سرعت بالاتر و الگوريتمهاي کليد عمومي داراي امنيت بهتري هستند. در ضمن گاهي از سيستم ترکيبي از هردو الگوريتم استفاده ميکنند که به اين الگوريتمها الگوريتم هاي ترکيبي (hybrid)گفته ميشود. اما اگر به طور دقيق تر به اين دو نگاه کنيم آنگاه متوجه خواهيم شد که الگوريتمهاي کليد عمومي و الگوريتمهاي کليد متقارن داراي دو ماهيت کاملاً متفاوت هستند و کار بردهاي متفاوتي دارند به طور مثال در رمزنگاريهاي ساده که حجم دادهها بسيار زياد است از الگوريتم متقارن استفاده ميشود زيرا دادهها با سرعت بالاتري رمزنگاري و رمزگشايي شوند. اما در پروتکل هايي که در اينترنت استفاده ميشود، براي رمز نگري کليد هايي که نياز به مديريت دارند از الگوريتمهاي کليد عمومي استفاده ميشود.
2.6 – Key Agreement همانطور که در بالا گفته شد به علت کند بودن و محدوديت رمزگذاري با روش نامتقارن از اين روش فقط براي رمزگذاري کليد مشترک استفاده ميشود. اما اين روش نيز يک مشکل دارد و آن اينست که هر شخص نياز به کليد عمومي و خصوصي مربوط به خود را دارد و بايد براي انتقال اطلاعات آن را براي طرف مقابل بفرستد. يک راه براي حل مشکل استفاده از کليد عمومي و يک مکانيزم به نام Key Agreement ميباشد که به طبق آن يک توافق بر روي کليد مخفي بين طرفين به وجود ميآيد و به اين ترتيب نيازي به انتقال کليد نيست. وقتي که يک بار بر روي يک کليد مشترک توافق حاصل شد از آن ميتوان براي رمزگذاري و رمزگشايي اطلاعات مربوطه استفاده کرد. معمولاً در اين روش از الگوريتم Diffie-Hellman استفاده ميشود. مراحل انتقال اطلاعات از اين روش به صورت زير ميباشد: - آغازگر ابتدا يک جفت کليد عمومي و خصوصي ايجاد کرده و کليد عمومي را همراه با مشخصات الگوريتم (Algorithm Specification) به سمت طرف مقابل ميفرستد. - طرف مقابل نيز يک جفت کليد عمومي و خصوصي همراه با مشخصات الگوريتم آغازگر ساخته و کليد عمومي را براي آغازگر ميفرستد. - آغازگر يک کليد مخفي بر اساس کليد خصوصي خود و کليد عمومي طرف مقابل ايجاد ميکند. - طرف مقابل نيز با استفاده از کليد خصوصي خود و کليد عمومي آغازگر يک کليد مخفي ميسازد. الگوريتم Diffie-Hellman تضمين ميکند که کليد مخفي هر دو طرف يکسان ميباشد.
3 - انواع روشهاي رمزگذاري اسناد
3.1 - رمزگذاري همه اطلاعات يک سند xml سند زير را در نظر بگيريد:
<?xml version=’1.0??> <PaymentInfo xmlns=’http://example.org/paymentv2?>
<Name>John Smith</Name>
<CreditCard Limit=’5,000? Currency=’USD’>
<Number>4019 2445 0277 5567</Number>
<Issuer>Example Bank</Issuer> <Expiration>04/02</Expiration> </CreditCard> </PaymentInfo>
اين سند پس از رمزگذاري بر اساس استانداردهاي W3C به شکل زير در ميآيد:
<?xml version=’1.0??> <EncryptedData xmlns=’http://www.w3.org/2001/04/xmlenc#’ MimeType=’text/xml’>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
3.2 - رمزگذاري يک element مشخص از يک سند xml
رمزگذاري يک element مشخص بصورت زير ميباشد. در اين حالت <CreaditCard> رمزگذاري شده و به شکل زير در آمدهاست:
<?xml version=’1.0??> <PaymentInfo xmlns=’http://example.org/paymentv2?>
<Name>John Smith</Name>
<EncryptedData Type=’http://www.w3.org/2001/04/xmlenc#Element’
xmlns=’http://www.w3.org/2001/04/xmlenc#’>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
</PaymentInfo>
3.3 - رمزگذاري محتويات يک element مشخص در اين حالت فقط محتويات و اطلاعات درون يک element رمزگذاري شده و خود element ثابت باقي خواهد ماند:
<?xml version=’1.0??>
<PaymentInfo xmlns=’http://example.org/paymentv2?>
<Name>John Smith</Name>
<CreditCard Limit=’5,000? Currency=’USD’>
<EncryptedData xmlns=’http://www.w3.org/2001/04/xmlenc#’
Type=’http://www.w3.org/2001/04/xmlenc#Content’>
<CipherData>
<CipherValue>A23B45C56</CipherValue>
</CipherData>
</EncryptedData>
</CreditCard>
</PaymentInfo>
در اين حالتelement <CreditCard> ثابت مانده ولي محتويات آن رمزگذاري شدهاست.
اطلاعات پس از رمزگذاري طبق استاندارد W3C درون عنصر <ChipherData> قرار ميگيرند. همچنين در اين قسمت يک عنصر <EncryptedData> ديده ميشود که شامل اطلاعاتي از قبيل نوع رمزگذاري و يا الگوريتم مورد استفاده براي رمزگذاري ميباشد.
3.4 – کليدهاي مورد استفاده در رمزگذاري وقتي يک سند XML يا بخشي از آن رمزگذاري ميشود آن قسمت با عنصر <EncryptedData> تعويض ميشود. اين عنصر ممکن است شامل نوع رمزگذاري باشد که گيرنده از اين اطلاعات استفاده ميکند، مثلاً اطلاعاتي شامل اينکه آيا کل سند رمزگذاري شده يا قسمتي از آن و همچنين اينکه نوع اطلاعات رمزگذاري شده متن است يا تصوير و غيره.
ميتوان مشخصات کليد مشترک را درون خود سند درون عنصر <EncryptedKey> قرار داد. اطلاعات واقعي که رمزگذاري شدهاند درون عنصر <CipherData> قرار ميگيرند. در داخل اين قسمت نيز يک عنصر <CipherValue> قرار دارد که شامل اطلاعات واقعي رمزگذاري شده ميباشد.
3.5 – روشهاي انتقال کليد طبق استاندارد W3C سه روش براي انتقال کليد موجود ميباشد:
1. ميتوان کليد را درون همان سند قرار داد، عناصر <EncryptedData> و يا <EncryptedKey> ميتوانند يک عنصر <ds:KeyInfo> داشته باشند که مشخص کننده جزييات کليد ميباشد. خود اين عنصر شامل عناصر زير ميباشد: - عنصر <ds:KeyValue> که مقدار آن همان کليد عمومي يا کليد رمزگذاري شده ميباشد. - عنصر <ds:KeyName> که به يک عنصر <EncryptedKey> اشاره ميکند. - عنصر <ds:RetrievalMethod> که متد بازيابي کليد را مشخص ميکند.
2. ميتوان يک فايل ديگر که شامل عنصر <EncryptedKey> ميباشد ضميمه سند کرد که در اين حالت درون سند xml عنصر <DataReference> يا <KeyReference> قرار ميگيرد که به آن ضميمه اشاره ميکند. 3. در روش سوم در هيچ قسمت از سند XML به کليد اشارهاي نميشود و مسير کليد از قبل مشخص ميباشد.
4 – امضاي ديجيتالي 4.1 – معرفي امضاي ديجيتالي براي اينکه هويت فرستنده سند تاييد شود و نيز براي اطمينان از اينکه سند در طول مدت انتقال به گيرنده دستکاري نشدهاست از امضاي ديجيتالي استفاده ميشود. ميتوان کل يک سند و يا قسمتي از آن را امضا کرد. به طور کلي سه دليل براي استفاده از امضاي ديجيتالي وجود دارد که شامل: 1. استفاده از کليد عمومي اين اجازه را به هر شخصي ميدهد که کليد خود را به سمت فرستنده اطلاعات بفرستد و سپس گيرنده پس از دريافت اطلاعات آن را توسط کليد خصوصي خود بازگشايي ميکند، بنابراين امضاي ديجيتالي اين امکان را ميدهد که فرستنده يا گيرنده مطمين شوند که اطلاعات از محل يا شخص مورد نظر دريافت ميشود. 2. اطلاعات در طول مدت انتقال ممکن است توسط ديگران دستکاري شود براي اينکه از صحت اطلاعات رسيده مطمين شويم نياز به يک امضاي ديجيتالي در اين حالت احساس ميشود. 3. رد کردن اطلاعات فرستاده شده. گيرنده اطلاعات براي اينکه مطمين شود فرستنده بعدا از اطلاعاتي که فرستاده اعلام بي خبري نکند و آنها را رد نکند از فرستنده يک امضا درخواست ميکند تا شاهدي بر اين ادعا باشد.
براي پياده سازي يک امضاي ديجيتالي نياز به سه الگورتم داريم: - يک الگوريتم براي ايجاد کليد - الگوريتم براي ايجاد امضا - الگوريتم براي تاييد امضا
براي ايجاد يک امضاي ديجيتالي بايد يک عدد checksum براي سند مورد نظر محاسبه شود. فرض کنيد Bob قصد ارسال يک پيام به Alice را دارد، Bob پيام خود را همراه با امضاي ديجيتالي براي Alice ميفرستد. اين امضاي ديجيتالي توسط کليد خصوصي که مالک آن Bob ميباشد ايجاد شدهاست. در سمت ديگر Alice با استفاده از الگوريتم تاييد امضا و کليد عمومي که از Bob دريافت کرده صحت امضا و اينکه امضا از طرف Bob ميباشد را تاييد ميکند.
4.2 – عناصر موجود در يک امضا در شکل زير عناصر تشکيل دهنده يک امضاي ديجيتالي را ميبينيد:
براي ايجاد يک امضاي ديجيتالي بايد طبق استاندارد W3C به صورت زير عمل کرد:
1. ابتدا بايد منبعي را که قصد امضاي آن را داريد مشخص کنيد. عنصر <Reference> که در شکل ديده ميشود مشخص ميکند که چه چيزي در اين قسمت امضا و علامت گذاري شدهاست. اين منبع به صورت يک آدرس URI ميباشد: http://www.abc-company.com/index.html به يک منبع از نوع فايل HTML اشاره ميکند. http://www.abc-company.com/logo.gif به يک فايل تصويري اشاره ميکند. http://www.abc-company.com/xml-files/info.xml به يک فايل از نوع XML اشاره ميکند. http://www.abc-company.com/xml-files/info.xml#main به يک عنصر درون فايل XML به نام main اشاره ميکند.
1. testInfo: به يک عنصر درون فايل XML فعلي اشاره ميکند.
2. محاسبه مقدار digest به ازاي هر منبع مشخص شده در <Reference>، که اين مقدار در <DigestValue> قرار ميگيرد. همچنين عنصر <Reference> شامل عنصر <DigestMethod> ميباشد که الگوريتم مورد استفاده در محاسبه digest را معرفي ميکند.
3. همه منابع که بايد امضا شوند جمع آوري ميشود:
SignedInfo Id="foobar">
<CanonicalizationMethod
Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" />
<Reference URI="http://www.abccompany.com/news/2000/03_27_00.htm">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue>j6lwx3rvEPO0vKtMup4NbeVu8nk=</DigestValue>
</Reference>
<Reference
URI="http://www.w3.org/TR/2000/WD-xmldsig-core-20000228/signature-example.xml">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<DigestValue>UrXLDLBIta6skoV5/A8Q38GEw44=</DigestValue>
</Reference>
</SignedInfo>
عنصر <CanonicalizationMethod> مشخص ميکند که چه الگوريتمي براي قانوني کردن (canonize) عنصر <SignedInfo> استفاده شدهاست.
4. علامت گذاري امضا: در اين قسمت مقدار digest براي عنصر <SignedInfo> محاسبه شده و درون عنصر <SignatureValue> قرار ميگيرد. 5. اضافه کردن مشخصات کليد: ميتوانيد مشخصات کليد خود را درون عنصر <KeyInfo> قرار دهيد ولي اين قسمت الزامي نيست و ممکن است شما نخواهيد که اين مشخصات معلوم گردد.
4.3 – تاييد يک امضاي ديجيتالي مراحل تاييد Verify يک امضاي ديجيتالي به صورت خلاصي در زير آورده شدهاست: - تاييد امضاي عنصر <SignedInfo>. براي اين منظور ابتدا دوباره مقدار digest براي اين عنصر را طبق الگوريتم مشخص شده در عنصر <SignatureMethod> محاسبه نموده و از کليد عمومي براي اين کار استفاده ميشود و براي تاييد آن مقدار محاسبه شده را با مقدار معرفي شده در عنصر <SignatureValue> مقايسه ميکنيم. - اگر مرحله قبل بدون مشکل تاييد شد حالا به ازاي هر منبع معرفي شده در عنصر <Reference> مقدار digest آن را محاسبه نموده و با مقدار مشخص شده در عنصر <DigestValue> مقايسه ميکنيم.
منبع:http://www.academist.ir /س