پیاده سازی الگوریتم رمز AES با زبان PHP

رمزنگاری دانشی بر مبنای علم اعداد است که به منظور ارتقاء امنیت داده‌های موجود در یک بستر ناامن انجام می‌گیرد. با استفاده از این تکنیک، اطلاعات اصلی در یک فرآیند قرار گرفته و تبدیل به داده‌های نامفهوم شده تا برای شخص سوم قابل درک نباشند. این فرآیند شامل دو مولفه اصلی “کلید” و “الگوریتم” است. به این صورت که کلید وظیفه برقراری این فرآیند رو دارد و الگوریتم ایجاد تغییرات اصلی در اطلاعات را بر عهده دارد. در نتیجه میزان امنیت داده‌های ما به طور کامل به این دو مولفه بستگی خواهد داشت.

یکی از قوی‌ترین سیستم‌های رمز، استاندارد رمزنگاری پیشرفته (Advanced Encryption System) است. AES یک الگوریتم برای رمزگذاری داده‌های دیجیتال هست که قابلیت پیاده‌سازی بر روی نرم‌افزار و سخت‌افزار را دارد. این سیستم بعد از الگوریتم DES به عنوان یک استاندارد در نظر گرفته شد.

AES بعد از تبدیل داده‌ها به باینری، آن‌ها را در بلوک‌هایی با اندازه ثابت 128 بیت قرار داده و با کلیدهای 128، 192 یا 256 بیتی وارد فرآیند رمز می‌شود. این بلوک‌ها به عنوان ماتریس‌های 4*4 در نظر گرفته می‌شوند و مقدار کلید، تعداد تکرارهای تبدیل ماتریس‌ها را تعیین می‌کند.

استاندارد رمزنگاری پیشرفته بر اساس سیستم رمز متقارن کار می‌کند. به این صورت که تنها از یک کلید (عمومی) برای رمزگذاری و رمزگشایی استفاده می‌شود. بعد از تبدیل ماتریس‌ها، بر اساس مقدار کلید، یک فرآیند معکوس انجام شده و داده رمز شده (Cipher Text) به داده اصلی (Plain Text) تبدیل خواهد شد.

تمامی زبان‌های برنامه‌نویسی قابلیت پیاده‌سازی این سیستم رمز را دارند. در زبان PHP برای این منظور تابع mcrypt در نظر گرفته شده است. در توزیع‌های سیستم عامل‌ لینوکس (مبتنی بر Debian) با استفاده از دستور زیر می‌توانید این تابع را نصب کنید.

در این مثال قصد داریم رمزگذاری و رمزگشایی یک متن را با استفاده از الگوریتم AES پیاده‌سازی کنیم. برای این منظور به دو تابع اصلی نیاز داریم که آرگومان‌های اولیه این دو، متغیرهای “کلید” و “متن” خواهند بود.

در ابتدا تمام مقادیر رو به عنوان آرگومان‌های تابع mcrypt_encrypt داخل توابع اصلی قرار می‌دهیم. به این صورت داده ما وارد فرآیند رمز می‌شود. اولین آرگومان، تابع MCRYPT_RIJNDAEL_256 هست.  Rijndael یک نام دیگر برای الگوریتم AES است و مقدار 256 طول کلید را تعیین می‌کند که شما می‌توانید 128 یا 192 را جایگزین آن کنید. در ادامه دو متغیر $Text و $Key رو قرار می‌دهیم. تا الان کد ما به شکل زیر خواهد بود:

در رمزنگاری یک بحث وجود دارد با عنوان  Operation Modes که نحوه اتصال بلوک‌ها را تعیین می‌کند. هر کدام از Modeها یکسری معایب و مزایا دارند. در اینجا قصد داریم حالت ECB را بررسی کنیم.

داده‌های رمز شده در بلوک‌هایی با اندازه مشخص قرار می‌گیرند. بعد از آن با استفاده از متد ECB هر بلوک به بلوک بعدی متصل شده و با توجه به مقدار کلید فرآیند تکرار انجام می‌شود. نوع اتصال ECB این امکان را فراهم می‌کند که فرآیند تکرار برای هر بلوک به صورت مجزا صورت بگیرد. به عنوان مثال، ما می‌توانیم یک متد نامنظم برای تکرار بلوک‌ها تعیین کنیم.

تابع ECB را به صورت آرگومان برای تابع اصلی اضافه می‌کنیم.

برای نوشتن تابع رمزگشایی همین فرآیند را به طور معکوس انجام می‌دیم. در نتیجه به این شکل خواهد بود:

تا اینجای کار صرفا توابع را طراحی کردیم. قطعا برای دریافت و ارسال اطلاعات باید از فرم‌های HTML استفاده کنیم.

مقادیر ‘text’ و ‘key’ را برای inputهای متن مورد نظر و کلید، و همین طور encrypt و decrypt رو برای کلیدهای رمزگذاری و رمزگشایی در نظر می‌گیریم، در نتیجه کد به این صورت خواهد بود:

توجه داشته باشید که این نوع پیاده‌سازی، یک روش بسیار ساده است و شما می‌توانید با ادغام سایر توابع و طولانی‌تر کردن فرآیند رمز، امنیت داده را ارتقا دهید.

یک مثال پیاده‌سازی‌شده الگوریتم AES با زبان PHP را می‌توانید اینجا مشاهده کنید.

مسعود صدری

یک توسعه دهنده وب هستم.

همچنین ممکن است دوست داشته باشید ...

۱۲ واکنش

  1. علی گفت:

    ممنون
    مفید بود.

  2. ممنون از نوشته. آیا راهی‌ هست تا مقدار رمزنگاری شده توسط الگوریتم AES در سمت کلاینت decrypt شود؟

  3. حسن احمدی گفت:

    بسیار عالی ، مفید کامل و کاربری

  4. محمدجعفر گفت:

    « شما می‌توانید با ادغام سایر توابع و طولانی‌تر کردن فرآیند رمز، امنیت داده را ارتقا دهید.»
    این بخش خیلی درست نیست، ادغام توابع رمزنگاری باهم در خیلی از موارد باعث ایجاد آسیب پذیری و آسان شدن رمزگشایی می‌شود. برای امنیت بیشتر افزایش طول کلید راه حل بهتری است.

  5. ناصر گفت:

    امنیت هم بیشتر نمیشه!

  6. سمانه شکیبا گفت:

    سلام پیاده سازی الگوریتم DES و ۳DES رو در PHP ندارین ؟

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *