مدل سازی آماری در آنالیز رمز
در رمزنگاری بررسی آماری حروف و خروجی الگوریتم کد کننده به این منظور که تعداد تکرار و فراوانی هر حرف در رشته بررسی شود نوعی حمله به الگوریتم تلقی میشود . این روش بیشتر روی متد های کلاسیک (جایگزینی) پاسخگو هست . فرآیند عمل به این صورت هست که در هر زبان خاص پراکندگی استفاده از حروف مختلف متفاوت هست به طور مثال در زبان انگلیسی حرف ‘E’ بیشترین فراوانی را داراست . جدول کامل این فراوانی ها به شکل زیر هست :
طبق جدول بالا مشاهده میشود که بعد از حرف E بیشترین فراوانی مربوط به T هست همچنین کمترین فراوانی ها هم مربوط به Z و Q هستند . با توجه به این داده ها ما این امکان رو داریم با بررسی یک رشته رمز شده و شناسایی فراوانی ها در آن رشته ، فرآیند جایگزین کردن حروف رمز و حروف اصلی زبان انگلیسی را انجام دهیم . البته نا گفته نماند ممکن است در هر شرایطی این قوانین پایداری نداشته باشند و گاهی اوقات پاسخ مورد نظر را از روش انتخاب شده دریافت نکنیم . همچین رشته مورد نظر برای بررسی بهتر هست که طول کوتاهی نداشته باشد .
طبق مطالب بالا اگر بخواهیم روش جامعیتی بیشتری ببخشیم میتوان گفت برای هر زبان مشخصی با بررسی اماری داده ها امکان رمزگشایی برای ما فراهم آید . حال ما فرض میکنیم رشته رمزی داریم با زبان منبع انگلیسی و قصد داریم اون رو به حالت عادی و قابل درک برگردونیم . قدم های زیر پیش روی ما هست :
- بررسی فراوانی حروف در رشته رمز شده
- بررسی فراوانی حروف در زبان مورد نظر
- تعویض حروف با یکدیگر متناسب با فراوانی آن ها
رشته زیر را در نظر بگیرید :
Ruf fjivcfar nziwa zn afqifr micrcet ifybcifg vcrrvf wzif ruje micrcet cwhvfwfera aceqf wzar hfzhvf qzbvg ezr ifjg. Wzif vcrfijqx, zi vcrfijrf zhhzefera, ifybcifg jqrbjv qixhrztijhux. Ruf wjce qvjaacqjv qchufi rxhfa jif rijeahzacrcze qchufia, mucqu ifjiijetf ruf zigfi zn vfrrfia ce j wfaajtf (f.t., 'ufvvz mzivg' kfqzwfa 'fuvzv zmigv' ce j ricdcjvvx acwhvf ifjiijetfwfer aqufwf), jeg abkarcrbrcze qchufia, mucqu axarfwjrcqjvvx ifhvjqf vfrrfia zi tizbha zn vfrrfia mcru zrufi vfrrfia zi tizbha zn vfrrfia (f.t., 'nvx jr zeqf' kfqzwfa 'twp kb hzgn' kx ifhvjqcet fjqu vfrrfi mcru ruf zef nzvvzmcet cr ce ruf Vjrce jvhujkfr). Acwhvf dfiaczea zn fcrufi ujdf efdfi znnfifg wbqu qzencgfercjvcrx nizw ferfihicacet zhhzefera. Je fjivx abkarcrbrcze qchufi mja ruf Qjfaji qchufi, ce mucqu fjqu vfrrfi ce ruf hvjcerfsr mja ifhvjqfg kx j vfrrfi azwf ncsfg ebwkfi zn hzacrczea nbirufi gzme ruf jvhujkfr. Abfrzecba ifhzira rujr Lbvcba Qjfaji bafg cr mcru j aucnr zn ruiff rz qzwwbecqjrf mcru uca tfefijva. Jrkjau ca je fsjwhvf zn je fjivx Ufkifm qchufi. Ruf fjivcfar oezme baf zn qixhrztijhux ca azwf qjidfg qchufirfsr ze arzef ce Ftxhr (qj 1900 KQF), kbr ruca wjx ujdf kffe gzef nzi ruf jwbafwfer zn vcrfijrf zkafidfia ijrufi ruje ja j mjx zn qzeqfjvcet cenziwjrcze.
برای بررسی فراوانی حروف از کد زیر استفاده میکنیم (کد های خیلی خوب با آپشن های بیشتر در اینترنت موجود هست ) :
# -*- coding: utf-8 -*- import string,re chars = list(string.lowercase) freq = [0]*len(chars) cipher = open('/home/user/Desktop/cipher.txt').read().lower().replace(' ','') cipher= re.sub("[^a-z]", "",cipher) for i in cipher: freq[chars.index(i)] += 1 for i in range(len(freq)): print chars[i],' --> ',freq[i]
خروجی کد در برای رشته بالا به شکل زیر هست :
a --> 65 b --> 23 c --> 74 d --> 7 e --> 58 f --> 143 g --> 17 h --> 36 i --> 83 j --> 72 k --> 16 l --> 1 m --> 18 n --> 25 o --> 1 p --> 1 q --> 40 r --> 98 s --> 4 t --> 18 u --> 52 v --> 50 w --> 28 x --> 18 y --> 2 z --> 68
مشاهده میشه که بیشترین عدد برابر با ۱۴۳ و برای حرف f هست . از این خروجی میشه فهمید که حرف f به جای حرف e استفاده شده پس با جایگزین کردن حرف e به جای f در رشته رمز یک قدم به متن اصلی نزدیک میشویم . به همین شکل ادامه روش هست ، برای عدد دوم که ۹۸ و مربوط به حرف r هست با توجه به جدول فراوانی نیاز است r با t تعویض شود و تا آخر به همین صورت که متن حدودا قابل فهمی به دست بیاید باید ادامه داد . البته برای رشته بالا ممکن است به دلیل کوتاه بودن روش پاسخگو نباشد .
متن اصلی به شکل زیر هست که میتونید برای بررسی از آن استفاده کنید :
The earliest forms of secret writing required little more than writing implements since most people could not read. More literacy, or literate opponents, required actual cryptography. The main classical cipher types are transposition ciphers, which rearrange the order of letters in a message (e.g., 'hello world' becomes 'ehlol owrdl' in a trivially simple rearrangement scheme), and substitution ciphers, which systematically replace letters or groups of letters with other letters or groups of letters (e.g., 'fly at once' becomes 'gmz bu podf' by replacing each letter with the one following it in the Latin alphabet). Simple versions of either have never offered much confidentiality from enterprising opponents. An early substitution cipher was the Caesar cipher, in which each letter in the plaintext was replaced by a letter some fixed number of positions further down the alphabet. Suetonius reports that Julius Caesar used it with a shift of three to communicate with his generals. Atbash is an example of an early Hebrew cipher. The earliest known use of cryptography is some carved ciphertext on stone in Egypt (ca 1900 BCE), but this may have been done for the amusement of literate observers rather than as a way of concealing information.ناف
نا گفته نماند در کد بالا ما حروف اصلی زبان انگلیسی را در نظر گرفتیم . شما با توجه به حدسی که روی متن اصلی میزنید میتوانید اعداد و سمبل های زبان انگلیسی رو وارد کد خودتون بکنید .
با توجه به بحث هایی که بالاتر انجام شد الگوریتم مثال در آشنایی با ماتریس ها در رمزنگاری به این روش نیز آسیب پذیر است و با بررسی خروجی های ماتریس میتوان به انالیز اماری رشته رمز پرداخت .
مطالب زیر را حتما مطالعه کنید
آشنایی با Bloom Filter
احراز هویت توسط JWT
آشنایی با توابع در پایتون
راه اندازی Django به همراه Postgresql، Nginx و Gunicorn
آشنایی با حلقه ها در پایتون
آسیب پذیری DDE مایکروسافت
2 Comments
Join the discussion and tell us your opinion.
دیدگاهتان را بنویسید لغو پاسخ
برای نوشتن دیدگاه باید وارد بشوید.
برای بررسی فراوانی حروف از کدام کدهای دیگر استفاده میکنیم؟تفاوت کدها در چیست؟
میشه لینک هم قرار بدهید؟
به عنوان مثال ابزار آنلاین زیر :
http://www.richkni.co.uk/php/crypta/freq.php
یا کد های زیر :
https://github.com/ojag/wordsworth
https://github.com/benbalter/Frequency-Analysis
ببینید خروجی یکسان هست و طبیعتا تکرار هر کارکتر در رشته رو بهتون میده … اما میتونن باهم در نوع خروجی دادن ،نوع کارکتری که در نظر میگیرن و … فرق داشته باشند
البته همه چیز به استفاده شما از اطلاعات بستگی داره