كدگذاری (Encryption) :به پروسه  تبدیل یك پیغام كاملا عادی (Plaintext) به داده هایی كه كاملا تغییر یافته و بدون معنی (ciphertext) به نظر می رسند ، گفته می شود.

رمزگشایی (decryption) :به پروسه تبدیل ciphertext به plaintext گفته می شود.

 Cryptography: علم ایجاد ارتباطات امن در دنیای داده ها.

Cryptanalysis: به روش های شكستن ciphertext گفته می شود ( یعنی بدست آوردن plaintext بدون دانستن كلید اصلی ).

Cryptology: شاخه ای از ریاضیات كه سروكارش با cryptography and cryptanalysis است.

Cryptographic algorithm: كه به آن cipher هم گفته می شود ، تابعی ریاضی است كه انجام عملیات كدگذاری و برعكس را انجام می دهد.

الگوریتم های متقارن (Symmetric algorithms): از یك كلید برای رمزگذاری و رمزگشایی استفاده می كنند (در ادامه بعنوان Private Key Systems معرفی می شوند).

الگوریتم های نامتقارن (asymmetric algorithms) : از یك جفت كلید برای كدگذاری و رمزگشایی استفاده می كنند. این دو كلید با روابط ریاضی به هم مربوط می شوند اما تولید یكی از دیگری بسیار مشكل است (در ادامه بعنوان Public Key Algorithms معرفی می شوند).

Block Ciphers: الگوریتم های كدگذاری اطلاعات كه بر روی قطعاتی از داده ها با طول 64-bit كار می كنند ( مانند DES و RC2 ).

Stream Ciphers: این الگوریتم ها تنها یك بیت از داده ها را در هر لحظه كدگذاری می كنند (مانند RC4).

سیستم های كدگذاری بر مبنای روش های كلید خصوصی (Private Key Systems) :

• مثالها: DES, AES, IDEA, RC5, RC6, Blowfish, Twofish
• در این سیستم ها یك كلید برای هر دو حالت كدگذاری و رمزگشایی بكار برده می شود.
• تنها با تكه های ثابتی از قطعات داده ها كار می كنند (عموما 64 تا 256 بیت) ، بدین معنا كه داده ها باید به قطعاتی با طول ثابت تبدیل و سپس كدگذاری شوند. در این حالت عموما طول خروجی با طول ورودی یكسان است.
• در این روش ها از ابزارهایی مانند : عملیات جبری (جمع و ضرب و غیره) ، عملیات بیتی (XOR ، چرخش و غیره ) و table lookups (sBoxes) ، برای اختلاط كلید و داده ها استفاده می كنند.
• در این روش ها تنها با تغییر یك بیت از داده ها و یا كلید ، بیت های خروجی تا 50 تغییر خواهند كرد.

حملات گزارش شده به سیستم های كدگذاری بر مبنای كلید خصوصی :

• Brute force : امتحان كردن تك تك كلیدهای ممكن.
• اگر اختلاط داده ها با كلید به اندازه ی كافی پیچیده و یا كامل نباشد ، الگوریتم بكار گرفته شده ممكن است سبب درز اطلاعاتی درباره ی كلید شود و این حالت باعث می شود كه بتوان حدس های دقیق تری را برای روش Brute force زد.


مزایای الگوریتم های كدگذاری بر مبنای كلید خصوصی :

• بسیار سریع هستند (تنها به 20 clock cycles/byte or less برای انجام محاسبات نیازمند هستند).
• كلیدهایی با طول كوچك برای حفظ امنیت آنها كافی هستند. برای مثال كلیدهایی با طول 128 bits تا 100 سال آینده مطمئن هستند (تنها روش quantum cryptography می تواند آنرا بشكند) و كلیدهایی با طول 256 bits حتی در برابر quantum cryptography نیز مقاوم هستند.


سیستم های كدگذاری اطلاعات بر مبنای روش های كلید عمومی (Public Key Algorithms) :

• مثالها : RSA, Elliptic Curve, Diffie-Helman
• در اینگونه روش ها كلیدها با صورت یك جفت ارائه می شوند. اطلاعاتی كه با یك كلید كد گذاری شده است تنها با جفت كلید دیگر قابل رمزگشایی است و برعكس. (این دو كلید با روابط ریاضی به هم وابسته و مربوط هستند)
• این روشها به شما اجازه می دهند تا یك كلید را آزادانه منتشر كنید (the "public" key) و كلید دیگر را نزد خود محفوظ نگه دارید. ( این كلید مخفی عموما در كارتهای هوشمند و یا وب سرورها و .... ذخیره می شود ).
• در این روش ها هر كسی می تواند اطلاعات را با كلید عمومی منتشر شده كدگذاری نماید اما تنها شما هستید كه می توانید با استفاده از كلید خصوصی خود ، این داده ها را رمزگشایی نمایید.
• بر عكس ، شما می توانید پیغامی را با كلید مخفی خود كدگذاری نمایید و سپس همگانی كه دسترسی به كلید عمومی دارند ، آنرا رمزگشایی كنند.


مثالی از یك سیستم گذاری با كلید عمومی : RSA

• دو عدد اول بزرگ مانند p و q را پیدا نموده و سپس r = p * q را محاسبه نمایید.
• عدد اتفاقی مانند x را انتخاب كرده و سپس y ایی را بیابید كه به ازای تمام m های كوچكتر از r داشته باشیم : m^xy % r = m
• اینكار با دانستن p و q ساده می باشد اما تنها با دانستن r بسیار مشكل است و همچنین تجزیه ی r به p و q نیز بسیار مشكل است.
• p و q را فراموش كنید. كلید عمومی x و r خواهد بود و كلید خصوصی y می باشد.
• برای كدگذاری اطلاعات با كلید عمومی ، تمام اطلاعات به قطعاتی بیتی با اندازه ی كوچكتر از r شكسته می شوند.
• فرستنده تنها كافی است e = m^x % r را محاسبه نماید . در اینجا e قطعه ی گذاری شده است.
• برای رمزگشایی این قطعه تنها كافی است e^y % r = m محاسبه شود.
• به همین ترتیب داده ی كدگذاری شده با كلید خصوصی (f = m^y % r) را می توان با كلید عمومی رمزگشایی كرد (f^x % r = m) .
• باید به خاطر داشت : m^xx != m . بنابراین داده های گذاری شده با كلید عمومی را نمی توان با همان كلید عمومی رمزگشایی كرد.

حملات گزارش شده به سیستم های كدگذاری با كلید عمومی :

• برای شكستن RSA تنها كافی است كه r به p و q تجزیه شود. تجزیه كردن اعداد بسیار سریعتر از روش brute force است. سختی تجزیه ی یك عدد 512-bit به اندازه ی محاسبه ی 2^64 حالت مختلف كدها در سیستم كدگذاری با كلید خصوصی (روش brute force) است.
• هر چقدر روش های سریعتری برای تجزیه ی اعداد میسر شود ، شكستن RSA نیز به همان نسبت ساده تر خواهد شد.

هش كردن اطلاعات (Hashing) :

• مثالها : MD2, MD5, SHA
• checksum (مجموع مقابله ای(!)) یك پیغام را تولید می كنند.
• همانند روش های كدگذاری بر مبنای كلید خصوصی از عملیات جبری و بیتی پیچیده ای برای تركیب بیت ها و تولید خروجی استفاده می كنند.
• به این الگوریتم ها message digest, fingerprint or compression function نیز گفته می شود.
• این الگوریتم ها یك طرفه هستند و عمدا طوری طراحی شده اند كه مهندسی معكوس آنها تقریبا غیرممكن باشد.


موارد استفاده از الگوریتم های Hash :

• تولید امضای دیجیتال پیغام ها كه همراه با سیستم های كدگذاری كلید عمومی بكار گرفته می شود. در این حالت ، پیغام هش شده و سپس این هش با كلید خصوصی رمزگذاری می شود. سپس هر كسی كه كلید عمومی را داشته باشد باید دو كار را انجام دهد تا از این كه پیغام رسیده پیغام شما می باشد و یا اینكه تغییر داده شده است ، اطمینان حاصل نماید : 1- هش فرستاده شده را رمزگشایی كند ( با كلید عمومی ). 2- با استفاده از كلید عمومی ، مقدار هش پیغام را محاسبه كند. این دو را با هم مقایسه نماید.
• الگوریتم های كدگذاری با كلیدهای عمومی عموما كند می باشند( عموما هزار بار كندتر از سیستم های كدگذاری با كلید خصوصی ). بنابراین تركیب الگوریتم های هش كردن اطلاعات با این روشها بسیار ایده آل هستند زیرا نیاز به كدگذاری كل پیغام را با كلید خصوصی منتفی می كنند. تنها كافی است كه مقدار هش شده ی كل اطلاعات را در این میان به بازی گرفت.
• ایجاد یك مقدار با طول ثابت از منبعی از داده ها با طول بسیار زیاد. ( لازم به ذكر است كه هش تولید شده منحصر بفرد است. برای مثال اگر كلمه ی Vahid را با الگوریتم MD5 هش كنیم حاصل E5EDE944EBEE46D553DFE88EAB5168CE خواهد شدو یا با استفاده از الگوریتم SHA1 خروجی C6014B4E1596B58399DEEB1B25317FA7A7B29A6D می باشد. هیچ داده ی دیگری را نمی توان هش كرد كه این خروجی را تولید كند).
• برای بالاتر بردن امنیت دیتابیس حاوی پسوردهای كاربران بكار گرفته می شوند.


حملات گزارش شده در مورد الگوریتم های hashing :

• تصادم (Collisions) ، یافتن دو منبع اطلاعات كه یك hash را تولید كنند.
• درز اطلاعاتی در مورد منبع داده ها ( آیا می توان از مقدار هش ، اطلاعاتی را در مورد منبع آن حدس زد؟! )