رمزنگاری دانشی بر مبنای علم اعداد است که به منظور ارتقاء امنیت دادههای موجود در یک بستر ناامن انجام میگیرد. با استفاده از این تکنیک، اطلاعات اصلی در یک فرآیند قرار گرفته و تبدیل به دادههای نامفهوم شده تا برای شخص سوم قابل درک نباشند. این فرآیند شامل دو مولفه اصلی “کلید” و “الگوریتم” است. به این صورت که کلید وظیفه برقراری این فرآیند رو دارد و الگوریتم ایجاد تغییرات اصلی در اطلاعات را بر عهده دارد. در نتیجه میزان امنیت دادههای ما به طور کامل به این دو مولفه بستگی خواهد داشت.
یکی از قویترین سیستمهای رمز، استاندارد رمزنگاری پیشرفته (Advanced Encryption System) است. AES یک الگوریتم برای رمزگذاری دادههای دیجیتال هست که قابلیت پیادهسازی بر روی نرمافزار و سختافزار را دارد. این سیستم بعد از الگوریتم DES به عنوان یک استاندارد در نظر گرفته شد.
AES بعد از تبدیل دادهها به باینری، آنها را در بلوکهایی با اندازه ثابت ۱۲۸ بیت قرار داده و با کلیدهای ۱۲۸، ۱۹۲ یا ۲۵۶ بیتی وارد فرآیند رمز میشود. این بلوکها به عنوان ماتریسهای ۴*۴ در نظر گرفته میشوند و مقدار کلید، تعداد تکرارهای تبدیل ماتریسها را تعیین میکند.
استاندارد رمزنگاری پیشرفته بر اساس سیستم رمز متقارن کار میکند. به این صورت که تنها از یک کلید (عمومی) برای رمزگذاری و رمزگشایی استفاده میشود. بعد از تبدیل ماتریسها، بر اساس مقدار کلید، یک فرآیند معکوس انجام شده و داده رمز شده (Cipher Text) به داده اصلی (Plain Text) تبدیل خواهد شد.
تمامی زبانهای برنامهنویسی قابلیت پیادهسازی این سیستم رمز را دارند. در زبان PHP برای این منظور تابع mcrypt در نظر گرفته شده است. در توزیعهای سیستم عامل لینوکس (مبتنی بر Debian) با استفاده از دستور زیر میتوانید این تابع را نصب کنید.
sudo apt-get install php5-mcrypt
در این مثال قصد داریم رمزگذاری و رمزگشایی یک متن را با استفاده از الگوریتم AES پیادهسازی کنیم. برای این منظور به دو تابع اصلی نیاز داریم که آرگومانهای اولیه این دو، متغیرهای “کلید” و “متن” خواهند بود.
function Encrypt($Text, $Key); function Decrypt($Text, $Key);
در ابتدا تمام مقادیر رو به عنوان آرگومانهای تابع mcrypt_encrypt داخل توابع اصلی قرار میدهیم. به این صورت داده ما وارد فرآیند رمز میشود. اولین آرگومان، تابع MCRYPT_RIJNDAEL_256 هست. Rijndael یک نام دیگر برای الگوریتم AES است و مقدار ۲۵۶ طول کلید را تعیین میکند که شما میتوانید ۱۲۸ یا ۱۹۲ را جایگزین آن کنید. در ادامه دو متغیر $Text و $Key رو قرار میدهیم. تا الان کد ما به شکل زیر خواهد بود:
mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $Text, $Key);
در رمزنگاری یک بحث وجود دارد با عنوان Operation Modes که نحوه اتصال بلوکها را تعیین میکند. هر کدام از Modeها یکسری معایب و مزایا دارند. در اینجا قصد داریم حالت ECB را بررسی کنیم.
دادههای رمز شده در بلوکهایی با اندازه مشخص قرار میگیرند. بعد از آن با استفاده از متد ECB هر بلوک به بلوک بعدی متصل شده و با توجه به مقدار کلید فرآیند تکرار انجام میشود. نوع اتصال ECB این امکان را فراهم میکند که فرآیند تکرار برای هر بلوک به صورت مجزا صورت بگیرد. به عنوان مثال، ما میتوانیم یک متد نامنظم برای تکرار بلوکها تعیین کنیم.
تابع ECB را به صورت آرگومان برای تابع اصلی اضافه میکنیم.
mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $Text, $Key, MCRYPT_MODE_ECB);
برای نوشتن تابع رمزگشایی همین فرآیند را به طور معکوس انجام میدیم. در نتیجه به این شکل خواهد بود:
mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $Text, $Key, MCRYPT_MODE_ECB);
تا اینجای کار صرفا توابع را طراحی کردیم. قطعا برای دریافت و ارسال اطلاعات باید از فرمهای HTML استفاده کنیم.
مقادیر ‘text’ و ‘key’ را برای inputهای متن مورد نظر و کلید، و همین طور encrypt و decrypt رو برای کلیدهای رمزگذاری و رمزگشایی در نظر میگیریم، در نتیجه کد به این صورت خواهد بود:
if (isset($_POST['encrypt'])) { $crypted = Encrypt($_POST['text'], $_POST['key']); } else if (isset($_POST['decrypt'])) { $decrypted = Decrypt($_POST['text'], $_POST['key']); }
توجه داشته باشید که این نوع پیادهسازی، یک روش بسیار ساده است و شما میتوانید با ادغام سایر توابع و طولانیتر کردن فرآیند رمز، امنیت داده را ارتقا دهید.
یک مثال پیادهسازیشده الگوریتم AES با زبان PHP را میتوانید اینجا مشاهده کنید.
ممنون
مفید بود.
ممنون از نوشته. آیا راهی هست تا مقدار رمزنگاری شده توسط الگوریتم AES در سمت کلاینت decrypt شود؟
برای این کار باید از زبانهای سمت کلاینت مثل Java Script استفاده کرد.
عذر میخوام سوالم رو بد پرسیدم. آیا library جاواسکریپت برای این کار وجود دارد؟
بله. این لینک رو مطالعه کنید.
http://www.movable-type.co.uk/scripts/aes.html
ممنونم جناب صدری
بسیار عالی ، مفید کامل و کاربری
ممنون که مطالعه کردید.
« شما میتوانید با ادغام سایر توابع و طولانیتر کردن فرآیند رمز، امنیت داده را ارتقا دهید.»
این بخش خیلی درست نیست، ادغام توابع رمزنگاری باهم در خیلی از موارد باعث ایجاد آسیب پذیری و آسان شدن رمزگشایی میشود. برای امنیت بیشتر افزایش طول کلید راه حل بهتری است.
یک مثال ساده، فرض کنید تمام فرآیند توسط تابع base64 یک بار پردازش بشه. اون وقت چطور؟ آیا آسیب پذیری بیشتر شده؟
امنیت هم بیشتر نمیشه!
سلام پیاده سازی الگوریتم DES و ۳DES رو در PHP ندارین ؟
سلام وقت بخیر ببخشید لینک مثالی که گذاشتین خراب شده میشه درستش کنید
سلام. لطفاً سورس کد کامل سمت سرور این پستتون رو هم اضافه کنید. نکته بعدی اینکه برای کلید چه مقداری باید وارد کرد. هر چی وارد میکنم ارور میده! لطفا در جواب دادن و گذاشتن سورس کد کوتاهی نکنید. با تشکر از سایت خوبتون.