آشنایی با الگوریتم رمزنگاری M3

در این مقاله، این الگوریتم براساس جهش خودکار کلیدها می باشد. سورس کامل الگوریتم به همراه مثال های کاربردی برای درک چگونگی استفاده از این الگوریتم در ادامه، در اختیار شما قرار می گیرد.

آشنایی با الگوریتم رمزنگاری M3

مقدمه

اصول اساسی این الگوریتم بر نگاشت کاراکترها مبتنی بر جهش خودکار کلیدها می باشد.

طول عمر هر کلید دقیقا معادل طول کلید می باشد. این به این معناست که هر حالت از کلید، تنها بخشی از متن اصلی که به اندازه طول کلید قبل از جهش خودکار در این حالت است رمزی می شود. و حالت جدید بعد از جهش خودکار کلید، قسمت بعدی متن را رمزنگاری می کند و به همین ترتیب تا تمام متن رمزنگاری شود.

در تمام مدت این پروسه، شما یک کلید مشخص که کاربر آن را وارد کرده دارید که این کلید به طور مداوم به چهار Thread جداگانه با قابلیت جهش خودکار کلید تبدیل می شوند. این 4 کلید وظیفه دارند که به طور همزمان حروف متن اصلی را به این صورت که در هر زمان یک حرف را با دو روش به متن رمزی تبدیل کنند، این متدها به این صورت هستند: array remapping (نگاشت دوباره آرایه) و گونه پویایی از الگوریتم جایگزینی رمزی (substitutionCipher). همه این فرایند بارها و بارها تکرار می شود، همه چیز چندین بار رمزنگاری می شود تا متن رمزی به اتمام برسد.

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

نحوه استفاده از کد

کلاس را از سورس کدی که دانلود کرده اید، درون فضای نام  Namespace خود کپی کنید. سپس می توانید از کلاس معرفی شده اشیا را بسازید.

رمزنگاری

بلاک کد زیر، مثال کوتاهی از چگونگی رمزکردن یک متغیر رشته ای به نام YourTextString با استفاده از متغیر کلید رمزنگاری YourEncryptionKey می باشد.

M3encryption.Key = YourEncryptionKey;
M3encryption objEncrypt = new M3encryption();
objEncrypt.ClearTekst = YourTextString; 
objEncrypt.Encrypt();
if (objEncrypt.errorState > -1) {       
    MessageBox.Show(objEncrypt.EncryptedTekst);
}

ویژگی objEncrypt.errorState برای خطاها را قبل از امتحان روی کد خود، چک کنید.

errorState -1: 

این خطا به این معنی است که متن رمزشده حاوی کاراکتری خارج از بازه UTF-16 می باشد. این کاراکترها قبل از رمزنگاری در متن اصلی به ؟ تبدیل می شوند.

errorState -2: 

کلیدی جهت رمزنگاری فراهم نشده است و عملیات رمزنگاری متوقف می شود.

رمزگشایی

M3encryption.Key = YourEncryptionKey;
M3encryption objEncrypt = new M3encryption();
objEncrypt.EncryptedTekst = YourTextString; 
objEncrypt.Decrypt();
if (objEncrypt.errorState > -1) {       
    MessageBox.Show(objEncrypt.ClearTekst);
}

تصادفی سازی

تنظیم ویژگی Randomization=True و فعال کردن آن باعث می شود، زمانی که کد برای دفعات متوالی اجرا می شود برای کلید و متن اصلی یکسان، متن رمزی متفاوت تولید شود.

Randomization = False به صورت پیش فرض تنظیم شده است.

M3encryption.Randomization = true;

Fastmode

تنظیم ویژگی Fastmode = True فرایند رمزنگاری/رمزگشایی را تسریع می کند اما در عین حال امنیت مقداری کاهش می یابد. اگر رمزنگاری شما روی رشته های کوتاهی مانند پسورد، شماره کارت و... می باشد، نباید آن را در fastmode انجام دهید. اما اگر رمزنگاری شما روی اسنادی با طول چند صفحه است، بهتر است که در fastmode انجام دهید.

Fastmode = False به صورت پیش فرض تنظیم شده است.

تذکر! رمزنگاری و رمزگشایی هر دو باید در یک مد یکسان انجام شوند.

M3encryption.Fastmode = true;

عملکرد درونی الگوریتم:

- فرایند بوت استرپ (bootStrap)

از آنجا که الگوریتم، از کلیدهای با جهش خودکار استفاده می کند نیاز به یک فرایند بوت استرپ دارد تا اولین کلید رمزنگاری را به روشی امن مقداردهی اولیه کند. این تقریبا مشابه داستان "مرغ و تخم مرغ " است، چرا که رمزنگاری کلید نیاز به یک آرایه نگاشت دارد که به وسیله یک کلید رمزشده تولید می شود، اما کلید بدون آرایه نگاشت نمی تواند رمزگذاری شود. متناوبا، آرایه نگاشت می تواند با کلید متن اصلی تولید شود و یا به وسیله کدهای ثابت که این امنیت را پایین می آورد.

فرایند بوت استرپ شامل این 4 مرحله می شود:

1. یک آرایه نگاشت به وسیله کلید متن اصلی تولید می شود.

2. کلید متن اصلی توسط آرایه نگاشت رمز می شود.

3. یک آرایه نگاشت جدید با کلید رمزشده اخیر تولید می شود.

4. کلید جدید توسط آرایه نگاشتی که به تازگی تولید شده رمز می گردد.

 در آخر چیزی که به دست می آید، کلید رمزشده ای توسط آرایه نگاشتی است که به وسیله یک کلید رمزشده تولید گشته است، و آرایه نگاشتی برای رمزگذاری کلید که توسط یک کلید رمزشده "نامشخص" تولید شده است.

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

- حلقه های تکرار داخلی و خارجی

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

- کلیدهای داخلی و خارجی جهش خوکار

این کلید در فرایند رمزنگاری داخلی استفاده می شود. هر حرف کلید برای رمزنگاری یک حرف متناظر با آن در متن اصلی استفاده می شود. زمانی که کلید به پایان رشته خودش می رسد، فرایند رمزنگاری در یک نسخه جدید جهش کلید ادامه پیدا می کند. این فرایند تا زمانی ادامه می یابد که تمام رشته متن اصلی رمزگذاری شود. درشکل زیر می توانید ساز و کار این فرایند را مشاهده کنید. کلید جهش خودکار داخلی به رنگ آبی نشان داده شده است.

inner-key- کلید خارجی جهش خودکار

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

مثال جهش خودکار کلید در 6 دور تکرار

            

آموزش سی شارپ

فایل های ضمیمه