آشنایی با ماتریس ها در رمزنگاری
احتمالا با مفهوم ماتریس به عنوان یکی از پرکاربرد ترین مفاهیم ریاضی آشنا باشید . با ماتریس در هر درسی از جبرخطی عددی تا آنالیزعددی و نظریه گراف ها درگیر هستیم .ما با مفهوم ماتریس یا به عنوان دیگر شاید آرایه های دو بعدی در رمزنگاری نیز سر و کار داریم . از استفاده هایی که میتوان به آن اشاره کرد تغییر مکان حروف در یک رشته به عنوان ساده ترین کاربرد است . همچنین میتوان از عملگر های ریاضی و عمل های مخصوص ماتریس نیز استفاده برد تا یک الگوریتم کارا و امن ایجاد کرد . البته کارا و امن بودن یک الگوریتم کاملا به پایه ریاضی آن و در واقع حل کردن آن در صورت نداشتن یکی پایه های اصلی مسئله برمیگردد .
از روشهای رمز که میتوان در آن استفاده از ماتریس ها رو به وضوح مشاهده کرد ، روش Hill هست . این روش به طور خاص هم برای کلید و هم برای متن اصلی از ماتریس ها استفاده میکند . پایه اصلی آن جبر خطی عددی هست و از عمل های مربوط به ماتریس مانند معکوس ماتریس و ضرب ماتریس در خود استفاده میکند . از لحاظ امنیت این الگوریتم که بر پایه جبر خطی است امن نیست و آسیب پذیر به حملات Known Plain Text (متن آشکار) آسیب پذیر است . (البته در بعضی مقاله ها به عنوان Crib Analysis هم نام برده میشه) به این صورت که شخص حمله کننده چند نمونه از رشته ها قبل و بعد از اجرا شدن الگوریتم روی آن ها را دارد و با بررسی آن به یک کلید (در مورد Hill) یا الگوریتم واحد (به طور کلی) میرسد . به شکل کلی روش Hill را با تشکیل چند معادله خطی و حل آن ها میتوان شکست و فرآیند رمزگشایی را روی آن انجام داد .
قصد داریم به استفاده از پایتون و کتابخانه Numpy یک رشته متنی را مقداری مبهم سازی کنیم ، بدون در نظر گرفتن کارا و یا امن بودن روش .
کد پایتون :
import numpy as np import random def factors_avg(x): factors = [] for i in range(1, x + 1): if x % i == 0: factors.append(i) return factors[len(factors)/2] string = "this_is_zero_to_hero_simple_usage_of_matrices_in_cryptography_using_numpy_and_psuedo_random_number" print "String = ",string encoded = [] string = list(string) for i in range(0,len(string)): encoded.append(ord(string[i])) print "ASCII List = ",encoded if len(encoded)%2 != 0: encoded.append(0) fact = factors_avg(len(encoded)) matrix = np.matrix(encoded).reshape(fact,len(encoded)/fact) print "Reshaped Matrix = \n",matrix random_key = random.randint(1,9)*random.randint(1000,9999) print "Key = ",random_key print "Matrix wiht applied Key = \n" print (matrix+random_key)
کد بالا در واقع فقط دو عملیات ساده با ماتریس یعنی جمع و تغییر بُعد را داراست . این روش کاملا آسیب پذیر به BruteForce هست چون بازه تولید شده توسط اعداد بازه بزرگی نیست و لحاظ پیچیدگی زمانی حد بالای خطی را ایجاد میکند . همچنین با بررسی فراوانی عناصر در ماتریس میتوان هر عنصر را به یک حرف در زبان انگلیسی نگاشت ۱ به ۱ کرد و سپس به رمز گشایی کلی پرداخت .
خروجی کد بالا به شکل زیر هست :
String = this_is_zero_to_hero_simple_usage_of_matrices_in_cryptography_using_numpy_and_psuedo_random_number ASCII List = [116, 104, 105, 115, 95, 105, 115, 95, 122, 101, 114, 111, 95, 116, 111, 95, 104, 101, 114, 111, 95, 115, 105, 109, 112, 108, 101, 95, 117, 115, 97, 103, 101, 95, 111, 102, 95, 109, 97, 114, 105, 99, 101, 115, 95, 105, 110, 95, 99, 114, 121, 112, 116, 111, 103, 114, 97, 112, 104, 121, 95, 117, 115, 105, 110, 103, 95, 110, 117, 109, 112, 121, 95, 97, 110, 100, 95, 112, 115, 117, 101, 100, 111, 95, 114, 97, 110, 100, 111, 109, 95, 110, 117, 109, 98, 101, 114] Reshaped Matrix = [[116 104 105 115 95 105 115] [ 95 122 101 114 111 95 116] [111 95 104 101 114 111 95] [115 105 109 112 108 101 95] [117 115 97 103 101 95 111] [102 95 109 97 114 105 99] [101 115 95 105 110 95 99] [114 121 112 116 111 103 114] [ 97 112 104 121 95 117 115] [105 110 103 95 110 117 109] [112 121 95 97 110 100 95] [112 115 117 101 100 111 95] [114 97 110 100 111 109 95] [110 117 109 98 101 114 0]] Key = 11736 Matrix wiht applied Key = [[11852 11840 11841 11851 11831 11841 11851] [11831 11858 11837 11850 11847 11831 11852] [11847 11831 11840 11837 11850 11847 11831] [11851 11841 11845 11848 11844 11837 11831] [11853 11851 11833 11839 11837 11831 11847] [11838 11831 11845 11833 11850 11841 11835] [11837 11851 11831 11841 11846 11831 11835] [11850 11857 11848 11852 11847 11839 11850] [11833 11848 11840 11857 11831 11853 11851] [11841 11846 11839 11831 11846 11853 11845] [11848 11857 11831 11833 11846 11836 11831] [11848 11851 11853 11837 11836 11847 11831] [11850 11833 11846 11836 11847 11845 11831] [11846 11853 11845 11834 11837 11850 11736]]
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.