سلام مهمان عزیز، اگر این پیغام رو میبینی یعنی هنوز تو انجمن بیکر ثبت نام نکردی. برای ثبت نام اینجا کلیک کن و از تمام امکانات انجمن استفاده کن و لذت ببر.
اگر قبلا ثبت نام کردی، وارد شو.
جهت حمایت از انجمن
کلیک کنید
logo

اگر اين نخستين بازديد شماست نام نويسي کنيد ، چرا نام نويسي ؟

بحث و گفتگو در رابطه با موضوعات انجمن
شرکت در نظر سنجي کاربر برتر ماه با جوايز ويژه

شکستن ویگنر با پایتون
#1
Information 
 چند روز پیش تاپیک دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.  رو میخوندم و یه نفر راجب بدیاش پرسیده بود، یه جوابی دادم و بعد خودم یه لحظه شک کردم که واقعا میشه به این راحتیا رمز رشته ای که با ویگنر سایفر شدرو پیدا کرد.
این شد که چند دقیقه پیش یه فایل پایتون ساختمو میخوام کد بزنم و ببینم میشه یا نه که با خودم گفتم کاری که نداره شاید برا بقیه هم جالب باشه که الان اینجامو میخوام مرحله به مرحله اینجا بنویسم که چه میکنم اونور.
[الان از سه چهار ساعت بعد میامو تصریح میکنم که خیلی کندم  22  میکنه و دشواره برای همین تقریبا وسط کار تمومش کردمو اراعه راهکارو گزاشتم برای یه ارسال بعد. پس اگه خیلی اهل برنامه نویسی یا پایتون نیستینو حوصلشو ندارین ولی رمز نگاری دوست. بپرین تا ستاره قرمز و بخونین ادامرو]
خوب اول از همه یه فایل ساختم به اسم vigenereCipher.py میخوام یه سری تابع توش بنویسم که برام طبق ویگنر یه رشترو با یه کلید انکد(رمز کردن) و دیکد(باز کردن) کنه.
اول از همه یه تابع مینویسم(اسمشم میزارم tableValueOf) که برام دو حرفو بگیره و طبق اون دوتا حرف، حرفی که بایدو از جدول ویگنر بهمون برگردونه.

[تصویر:  300px-Vigen%C3%A8re_square_shading.svg.png]

خوب میشه تابعو به این شکل نوشت:

کد:
def tableValueOf(x, y):
   
   if x=='a' and y=='a':
       return 'a';
   if x=='A' and y=='A':
       return 'A';    
   if x=='a' and y=='b':
       return 'b';
   if x=='A' and y=='B':
       return 'B';    
   if x=='a' and y=='c':
       return 'c';
   if x=='A' and y=='C':
       return 'C';
   .
   .
   .
ولی این خیلی زایه و طولانیه، پس یه تریک میزنیم که یکم قشنگ ترو کوتاه تر شه.
اول از همه اینکه حروف داخل کامپیوتر به صورت صفرو یک ذخیره میشن و به طور خاص تو کامپیوتر ها مرسوم به صورت سری های 8 تایی صفر و یک به نام بایت.
حالا میشه هر 8 صفرو یک پشت سر هم (که به نحوی یه عدد 8 رقمی مبنای دوعه)رو به مبنای ده تبدیل کرد. پس در نهایت هر حرف مثلا انگلیسی داخل کامپیوتر به صورت یه عدد ذخیره میشه که بهش میگن اسکی کد اون کاراکتر:
[تصویر:  p57y_ascii-table-for-the-alphabet.png]

خوب حالا مثلا تو جدول دو کاراکتر c و d بهمون کاراکتر f رو بر میگردونه یا به عبارتی اگه 99 و 100 یعنی اسکی کدشونو بزاریم بهمون 102 برمیگردونه که معادل 97-99+100 هستش پس میتونیم به تابع بگیم که بیا و اسکی کد دو کاراکتری که بهت میدمو جمع کن و منهای اسکی کد اولین کاراکتر ینی 97 بکن بعد کاراکتری که این اسکی کدو داره برگردون.
ولی یه مشکلی پیش میاد چون جدول جدید این طوری میشه:
[تصویر:  k26e_untitled.png]

که میتونین مشکلو ببینین اگه مثلا x رو با d بهش بدین یعنی عدداشون که 100 و 120 هستن بهمون عدد 123 رو برمیگردونه که اسکیش بعد حرف z هست و ما حرف a رو میخوایم پس یه تبصره هم لازمه که اگه چیزی که در اومد خیلی چیز درست حسابیی نبود یک 26 از اسکیش کم کن که به یه چیز معنیدار تبدیل شه.
در نهایت تابع tableValueOf به صورت یکم شیک تر این شکلی میشه:

کد:
def tableValueOf(x, y):
   
   if ord(x)+ord(y)-ord('a') > ord('z'):
       return chr(ord(x)+ord(y)-ord('a')-26)
   else:
       return chr(ord(x)+ord(y)-ord('a'))
دو تابع ord و chr توابع بومی پایتون هستن که به ترتیب کد اسکی کاراکتری که بهش بدی و کاراکتر متناظر با کد اسکیی که بهشون بدیو بر میگردونن.
حالا میتونیم تابع enCode رو با استفاده از این تابع به این شکل تعریف کنیم:

کد:
def enCode(string, key):
 
   stringCipher = ""
   keyIndex = 0

   for char in string:

       if char.isalpha():
           stringCipher += tableValueOf(char, key[keyIndex%len(key)])
           keyIndex += 1
       else:
           stringCipher += char

   return stringCipher
که اول کلید رو به حروف کوچیک تبدیل میکنه و یه رشته خالی میسازه که یکی یکی بهش اضافه میشه و چیزی که بایدو میسازه.
یه متغیرم هست به اسم keyIndex که حواسش هست که کجای کلید هستیم.
اینجا هم به جای اینکه رشته کلیدو هی تکرار کنیمو یه رشته بسازیم(واقعا کار چیپیه 22 ) طول رشته ای که میخواد رمز شه، میادو باقی مونده تابع keyIndex بر طول کلید رو بدست میاره و کاراکتری که بایدو پیدا میکنه. مثلا کاراکتر 20 اون رشته اگه ساخته شده بود دومین کاراکتر یه رمز 3 کلمه ای میشه.
*:پس تا این جا دوتا تابع تعریف کردمو توضیح دادم چطوری کار میکنن ولی این دوتا فقط حروف کوچیک زبان اینگیلیسیو کد میکنن که یه مشکلیه و باید یکم توسعه داده بشن که بتونن حروف بزرگم هندل کنن.
به دلیلی که الان به اول پست اضافه میکنمو شما هم احتمالا خوندین، ماژول شامل این دو تابع درست شده و توابع معکوسشون رو دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید. آپلود کردم که ما فقط با enCode و deCode کار داریم.
خلاصه اگه خیلی پایتون کار نکردین مهم نیست قسمت اصلی کد زدن اینجا بود و قسمت رمز نگاریو در واقع شکوندنش تو ادامه میاد که بیشتر خلاقیت و کار مغزی میخواد.
پس نگران نباشین که گیح بشین یا بد تر حوصلتون سر بره از اینجا به بعد اگه چیزی از پایتون بگم با انکار کامل این حقیقت که پایتون خیلی ساده و نزدیک به اینگیلیسیه، کدی پست کنم، زیرش راهنمای سینتکس میزارم که هر استیتمنت دقیقا به زبون آدم چه معنیی میده.
پس الان اگه ایده ای برای شکستن ویگنر دارین میتونین اینجا بگین و برای پیاده سازی هم اگه حوصلشو ندارین یا بلد نیستین بگین مطمعنم یکی پیدا میشه که پیادش کنه. پس اگه ایده نظر یا نقدی دارین خوشحال میشم بخونم و اگرم خوشتون اومد دکمه سپاس پایین سمت چپه.  3
بخش اول راه حلو دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید. پست کردم.
resim
پاسخ
 سپاس شده توسط Milad ، cake is a lie ، کارآگاه مرده ، Am.A ، Dead ، Nila ، EndLessCreations ، arefe.shoon ، DarkGuy ، liosa ، Louis ، Lestrade ، Hidden ، red hat ، Alishia ، Healer_ninja
#2
من فکر کنم حداقل ده بار دیگه باید این تاپیک رو بخونم تا بتونم یه راه کار ارائه بدم21 
ولی جدا از این قضیه خیلی به شخصه استقبال میکنم اگه آموزشی از برنامه پایتون توی انجمن بذاری یا متلب یا...
پاسخ
 سپاس شده توسط Cripher ، کارآگاه مرده ، Healer_ninja
#3
ای کاش یکم فونت درشت تر میکردی
حتما باید یبار با تمرکز بخونم 4

ولی در کل جالب بود
میتونم تمام روز ادامه بدم ........
(برای شنیدن پادکست صدای بیکر رو عکس کلیک کنید 4)
دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
resim
پاسخ
#4
کرایفر(شرمنده اگه اسم اشتباه تلفظ کردم  4 ) 
خیلی مطلب خافانی بود. حقیقتا و از ته قلب لذت بردم.
از این مطلبا بیشتر بزار.
پ.ن. نه نزار،بنده نمیتونم پایتون بریزم،حسودیم میشه  24
پاسخ
#5
(2020/07/07، 10:26 PM)mystery نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید. کرایفر(شرمنده اگه اسم اشتباه تلفظ کردم  4 ) 
خیلی مطلب خافانی بود. حقیقتا و از ته قلب لذت بردم.
از این مطلبا بیشتر بزار.
پ.ن. نه نزار،بنده نمیتونم پایتون بریزم،حسودیم میشه  24

پایتون خیلی به اینگیلیسی نزدیکه 22 . ولی بازم همونطور که گفتم اگه کد جدید پست کنم خیلی ساده توضیح میدم که هر کدوم از دستورا چیکار میکنن.  1
پاسخ
 سپاس شده توسط کارآگاه مرده ، red hat
#6
(2020/07/08، 06:20 AM)Cripher نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
(2020/07/07، 10:26 PM)mystery نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید. کرایفر(شرمنده اگه اسم اشتباه تلفظ کردم  4 ) 
خیلی مطلب خافانی بود. حقیقتا و از ته قلب لذت بردم.
از این مطلبا بیشتر بزار.
پ.ن. نه نزار،بنده نمیتونم پایتون بریزم،حسودیم میشه  24

پایتون خیلی به اینگیلیسی نزدیکه 22 . ولی بازم همونطور که گفتم اگه کد جدید پست کنم خیلی ساده توضیح میدم که هر کدوم از دستورا چیکار میکنن.  1

به غیر از پایتون زبون برنامه نویسی دیگه ای کار میکنی؟
ldsjvd \dk;vj,k
پاسخ
#7
(2020/07/08، 06:20 AM)Cripher نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
(2020/07/07، 10:26 PM)mystery نوشته است: دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید. کرایفر(شرمنده اگه اسم اشتباه تلفظ کردم  4 ) 
خیلی مطلب خافانی بود. حقیقتا و از ته قلب لذت بردم.
از این مطلبا بیشتر بزار.
پ.ن. نه نزار،بنده نمیتونم پایتون بریزم،حسودیم میشه  24

پایتون خیلی به اینگیلیسی نزدیکه 22 . ولی بازم همونطور که گفتم اگه کد جدید پست کنم خیلی ساده توضیح میدم که هر کدوم از دستورا چیکار میکنن.  1

والله که سی شارپ و جاوا اسکریپ هم به زبان انگلیسی خیلی نزدیکن
حتی من با سی شارپ خیلی راحت ترم چون حداقل دستوراتش آدم میفهمه کی کجا تموم میشه
البته کاملا شخصیه
من الان با اینکه بیشتر پایتون کار میکنم ولی هنوز هم حس میکنم که سی شارپ برام راحت تره
میتونم تمام روز ادامه بدم ........
(برای شنیدن پادکست صدای بیکر رو عکس کلیک کنید 4)
دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.
resim
پاسخ
#8
Information 
خوب من برگشتم که یکی از ایده هارو امتحان کنم اولش بگم که میخواستم ایده هامو از اونی که شانس کمتری داره شروع کنم که ترسیدم تنبلیم شه و از اونایی که به نظرم شانس بیشتری دارن شروع میکنم. از همین اولم بگم که متنای زرشکی شامل اطلاعات کمکی برنامه نویسین که سعی کردم طوری باشه که بشه با نخوندشون بازم فهمید چه خبره. پس اگه متن براتون طولانیه یا برنامه نویسی دوس ندارین ازشون رد شین. 3
ایده اول(خیلی بحث معروفو کهنی تو رمز نگاریه و خیلی نمیشه گفت فکر بکر منه.) میگه که کاربرد حروف اینگلیسی داخل یک متن استاندارد یکنواخت نیستو اگه بشه یه الگو پیدا کرد که بعد کد شدن ثابت بمونه شاید بشه فهمید که رشته قبل رمز شدن چه شکلی بوده.
اول باید نشون بدیم که ناهنجاری خیلی حاده و میشه بهش دست انداخت بعد باید ثابت کنیم که از الگو تبعیت میکنه و در نهایت باید ببینیم با کد شدن الگو دست میخوره یا نه.
اول از همه پاورشلو باز میکنم(اگه ویندوز 7 به بعد استفاده میکنین باید به صورت پیشفرض داخل منوی استارتتون باشه. اگرم استفاده نمیکنین کامند لاین بدون شلم مشکلی نداره.) و:
کد:
PS C:\Users\md> python
Python 3.8.2 (tags/v3.8.2:7b3ab59, Feb 25 2020, 23:03:10) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
اگه همیچین چیزی نمیبینین ینی یا پایتون ندارین یا کانفیگتون مشکل داره( از دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید. پیگیری کنین.)
سه تا > که میبینین سر خط ینی ما دیگه تو شل نیستیمو پایتون داره ازمون ورودی میگیره. پس خطایی که اولشون از اینا داره ورودیی که من دادم و خطایی که ندارن خروجیی که پایتون برگردونده.
خوب الان میخوام چن تا متن استاندارد اینگلیسیو وردارمو حروفشونو بشمرم. برای اینکار مثلا صفحه زبان اینگلیسیه ویکی پدیارو با یه کتابخونه بومی پایتون بارگیری میکنم. اول از ماژول ریکوعست ها متد گتو ایمپورت میکنم:
کد:
>>> from requests import get

که چیزی برنمیگردونه و ینی همه چی اوکیه. بعد صفحه ای که میخوامو میدم به این متد که برام لودش کنه:
کد:
>>> get("https://en.wikipedia.org/wiki/English_language")
<Response [200]>
که ریسپانس کد 200 رو برمیگردونه که ینی مشکلی نبوده (ریسپانس کد ها بخشی از پروتکل ارتباطی اچ تی ام الن که میگن وضعیت پاسخ یک سرور به کلاینت چه شکلیه مثلا ریسپانس کد 404 که احتمالا تاحالا دیدین به معنای پیدا نشدن آدرس مد نظر یا 403 به معنای محدودیت دسترسی به آدرسی که میخواینه.)
حالا برای اینکه هی نخوایم از نت صفحرو لود کنیم میریزیمش تو یه متغیر:
کد:
>>> page1=get("https://en.wikipedia.org/wiki/English_language")
خوب حالا ببینیم چن حرف تو صفحس:
کد:
>>> len(page1.text)
913800
خوب واضحا یکم زیاده و علت اینه که اگه محتواشو نگاه کنین میبینین که محتویات مارکاپ شده به زبان اچ تی ام ال توشن، که شامل کلی عبارتو کاراکتر اضافه برای نحوه نمایش بدنه متنه که ما نمیخوایم. برای حذف اینا راه های زیادی وجود داره من اینجا از یه کتابخونه به نام بیوتیفول سوپ استفاده میکنم(اسم عجیبی داره ولی کار اصلیش همین بیرون کشیدن دیتا از متن مارکاپ شده به زبان اچ تی ام ال یا خواهر برادراش مث ایک ام الو ایناست.) اول واردش میکنیم:
کد:
>>> from bs4 import BeautifulSoup as bs
چون اسم سختی داره بی اس صداش میزنیم که راحت باشیم.
خوب حالا به جای اچ تی ام ال مارک آپ آبجکت بیوتیفول سوپو میزاریم تو متغیرمون :
کد:
>>> page1=bs(page1.text)
کلاسی که بیوتیفول سوپ تعریف کرده یه متد داره که برامون متنو جدا میکنه. ببینیم چن کاراکتره:
کد:
>>> len(page1.get_text())
195169
همونطور که میبینین با حذف تگ ها متن اصلی خیلی کوتاه تره ولی هنوز توی خود متن کلی کاراکتر مثل وایت اسپیسو آکولادو کاراکتر نیو لاین(به صورت \n تو رشته میبینین.) یا کاراکتر تب(که به صروت \t تو رشته میبینین.) و چیزای دیگس که لازمشون نداریم. برای حذف اینا من رجکس استفاده میکنم:
کد:
>>>from re import sub
متد ساب میتونه برامون یه الگوی رجکسیو پیدا کنه و با یه چیزی جایگزین کنه ما میخوایم هر چی کاراکتر متنی نیستو حذف کنیمو رشته حاصلو بریزیم تو متغیری که ساختیم:
کد:
>>> page1=sub("[^a-z]+","",page1.get_text().lower())
متد ساب سه تا ورودی میگیره اولی یه رشتس که الگورو توضیح میده.(میتونم توضیح بدم رجکس چه شکلیاس ولی نه خیلی بلدم نه اینجا جاشه اگه براتون جالبه متیونین سرچ کنین تو هر زبانی که کد بزنین رجکس پیدا میشه.) اینجا آکولاد بازوبسته داره یه مجموعه کاراکترو توضیح میده که هر چی بین ای تا زد کوچیک نباشرو(^ ینی هر چی این الگورو تبعیت نکنه.) شامل میشه به علاوه بعدشم میگه حداقل یکی از اینا باید مطابقت کنه که تو الگوی رجکس حساب بشه.
ورودوی بعدی میگه هر چی پیدا کردی با رشته خالی ینی در واقع هیچ چی جابجا کن.
سومیم میگه رو چه رشته ای این کارارو انجام بده.
پس این دستور میادو هر چی حرف انگلیسی نیستو پاک میکنه و چیزایی که میمونرو میریزه تو متغیری که ساختیم.
حالا ببینیم چن تا کاراکتره:
کد:
>>> len(page1)
140819
حالا مثلا میشمریم چن تا ای داره:
کد:
>>> page1.count("a")
12496
حالا یه آرایه از الفبای اینگلیسی میسازیم:
کد:
>>> charSet=[]
>>> for i in range(ord('a'),ord('z')+1):
...     charSet.append(chr(i))
...
سه نقطه ای که میبینین مثل همون سه تا > میمیونه با این تفاوت که کد داخل روت نیستو تو اسکوپیه که کاربر باز کرده.حالا دیکشنری میسازیم که برامون نگه داره هر حرف چن درصد این متن بوده:
کد:
>>> dict ={}
>>> for char in charSet:
...     dict[char]=page1.count(char)/len(page1)*100
...
که نسبت تعداد هر کاراکترو به کل کاراکترا به درصدو به عنوان مقدار اون کلید حرف قرار میده. ببینیم چه شکلی شده:
کد:
>>> dict
{'a': 8.872806301091611, 'b': 1.6768346815718638, 'c': 3.642019587929063, 'd': 3.541168031477049, 'e': 11.05318854269501, 'f': 2.127825796691785, 'g': 3.1981306950944948, 'h': 3.8785235900313206, 'i': 8.236447184323975, 'j': 0.21661777970326918, 'k': 0.757096895618639, 'l': 5.075248045113316, 'm': 2.468732466388733, 'n': 8.593688965277234, 'o': 6.411176056988231, 'p': 2.2535351311425345, 'q': 0.11221511210857878, 'r': 6.658333392518519, 's': 6.970831173074055, 't': 6.94881428398946, 'u': 2.9360586927649663, 'v': 1.2301048998231545, 'w': 1.2840817891918381, 'x': 0.32244089175503016, 'y': 1.4275466793559706, 'z': 0.1065333342802963}
خوب چیزی که واضحه اینه که توضیع حروف یکنواخت نیست پس ما مرحله اولو رد کردیم حالا باید نشون بدیم الگو داره و پیداش کینم.
این کارایی که تاحالا کردیمو یه تابع میکنم که لینکو بگیره و دیکشنری تحویل بده:
کد:
>>> def count(url):
...     txt=sub("[^a-z]+","",bs(get(url).text).get_text().lower())
...     rtnDct={}
...     for char in range(ord('a'),ord('z')+1):
...             rtnDct[chr(char)]=txt.count(chr(char))/len(txt)*100
...     return rtnDct
...
حالا سه تاصفحه انتخاب کردم که ببینیم چه طورن اولی همین پیج ویکی پدیاعه که یه مقالس، دومی یه گزارشه و سومی یه داستانه:
کد:
>>> count("https://en.wikipedia.org/wiki/English_language")
{'a': 8.872806301091611, 'b': 1.6768346815718638, 'c': 3.642019587929063, 'd': 3.541168031477049, 'e': 11.05318854269501, 'f': 2.127825796691785, 'g': 3.1981306950944948, 'h': 3.8785235900313206, 'i': 8.236447184323975, 'j': 0.21661777970326918, 'k': 0.757096895618639, 'l': 5.075248045113316, 'm': 2.468732466388733, 'n': 8.593688965277234, 'o': 6.411176056988231, 'p': 2.2535351311425345, 'q': 0.11221511210857878, 'r': 6.658333392518519, 's': 6.970831173074055, 't': 6.94881428398946, 'u': 2.9360586927649663, 'v': 1.2301048998231545, 'w': 1.2840817891918381, 'x': 0.32244089175503016, 'y': 1.4275466793559706, 'z': 0.1065333342802963}
کد:
>>> count("https://www.wired.com/2015/04/silk-road-1/")
{'a': 8.037713183232922, 'b': 1.8146739229355127, 'c': 3.2926229955770734, 'd': 4.7887734114777665, 'e': 11.867275804954405, 'f': 1.9784860122677055, 'g': 2.3843759669463607, 'h': 4.852478112884731, 'i': 7.209552064942393, 'j': 0.22387652208733003, 'k': 1.1812671775177008, 'l': 4.260934456962924, 'm': 2.4499008026792377, 'n': 6.574325185198668, 'o': 7.57721919877687, 'p': 2.2697075044138257, 'q': 0.08736644764383611, 'r': 6.321326513896726, 's': 6.408692961540561, 't': 8.57283267505142, 'u': 2.7120001456107463, 'v': 0.9610309240821973, 'w': 2.2096430716586886, 'x': 0.23843759669463604, 'y': 1.6108188784332282, 'z': 0.1146684625325349}
کد:
>>> count("https://www.windowscentral.com/assassins-creed-story-so-far")
{'a': 7.9950201925120705, 'b': 1.8218807882670878, 'c': 3.6194698326906147, 'd': 3.622506300671059, 'e': 11.134728084292352, 'f': 2.4231014483952267, 'g': 2.562778975495703, 'h': 3.5040840494336987, 'i': 6.683266024959766, 'j': 0.6589135517565967, 'k': 0.7257158473263899, 'l': 4.408951507606353, 'm': 2.9575198129535725, 'n': 6.507150882093948, 'o': 6.774360064373121, 'p': 2.535450763671697, 'q': 0.3461573497707467, 'r': 5.869492606200468, 's': 8.335104606321925, 't': 8.745027783682021, 'u': 2.8573163695988826, 'v': 1.184222512373607, 'w': 1.8400995961497586, 'x': 0.6710594236783773, 'y': 1.8309901922084233, 'z': 0.38563143351653356}
مرحله دورم پاس کردیم همینطوری که میبینین محکم میشه گفت الگویی هست که بین این سه تا جدول رعایت شده مثلا ای تو همشون خیلی پر کاربرده ولی تو جزعیات تفاوت هایی وجود داره. اینجا باید گفت اینکه الگو وجود داره یا نه فقط توی دستور زبان سوال بله خیره. توی رمز نگاری این سوال در واقع پاسخ کیفی داره و میشه به الگو هایی که پیدا میکنیم امتیاز بدیمو از اینکارای خسته کننده تا ثابت کنیم این الگو چیز قابل اتکاییه. اینجا شما از من بپزیرین که به دلایلی که بعدا میگیم(اصلی ترینش اینه که اگه بخوایم امتیاز بدیم یه معیار میخوایم که جا خط کش عمل کنه و اون خط کش هر بار رو یکی از 27 حرف وای میسته و این خیلی مهمه چراش واضحه ولی نترسین تو ارسال بعدی واضح ترم میشه.) الگویی که وجود داره به نظر به اندازه کافی محکم میاد.
حالا باید برا الگو یه معیار بسازیم یه جورایی مثل ساختن وزنه یه کیلویی میمونه که بعدا باهاش بقیه چیزارو میسنجیم الان مثلا میتنونیم یه نمونه شامل کلی متن مختلفو جمع کنیمو همشونو که شمردیم یه جوری تعمیمش بدیم به همه متن های زبان اینگلیسی که به کلیت کار میگن آمار ولی لازم نیست اینکارو بکنیم. مورس حدود 1837 برای اینکه کد معروفشو بسازه میاد کلی متنو ورمیداره و حروفشونو میشمره که بتونه حروف پرکاربردو به خطو نقطه های کوتاه تر و ساده تر وصل کنه.
آمار مورس این شکلی بوده:
resim
ولی زبان از اونموقع تغیراتی داشته و به هرحال ملتم کارای آماری دقیق و بهتری انجام دادن نتیجشو با کلی اطلاعات باحال(از نظر من البته  4 ) میتونین دیدن لینک ها برای شما امکان پذیر نیست. لطفا ثبت نام کنید یا وارد حساب خود شوید تا بتوانید لینک ها را ببینید.  بخونین.
اگه ویکی پدیارو به عنوان مرجعو معیارمون قبول کنیم باید بریم سراغ گامی که توش باید بفهمیم الگو بعد از کد شدن یک متن با ویگنر اصطلاحا چقد کوراپت میشه(ممکنه اصنم نشه ولی این جا مثلا بعیده.) و آیا میتونیم الگورو بعد کد شدنم بشناسیم یا قیافش اینقد عوض میشه که دیگه کسی نمیتونه پیداش کنه.
از اونجایی که خسته شدمو میخوام ارسالو تموم کنم فقط اینو میگم که تو ارسال بعد این ایده که تموم شه توضیح میدم که چرا این ایده کافی نیستو به یه(حتی 2 بسته به اینکه چقد به خودمو شما دوشواری بدم  21 )استراتژی کمکی احتیاج داره پس فک نکنین سوال حل شده و جا فکر نداره اگه ایده جدیدی دارین خوشحال میشم بخونم اگرم خوشتون اومد پایین زیر موز خندون(البته اگه وقتی میخونین همچنان این پایین باشه. 22 ) سمت چپ ازم تشکر کنین.  1
resim
پاسخ
 سپاس شده توسط Milad ، Dead ، EndLessCreations ، Nila ، کارآگاه مرده ، Louis ، Alishia ، ^_^ ، red hat
#9
من برگشتم که ویگنرو بشکنم. 4

دارم متپلات لیبو میخونمو احتمالا کلی هنرنمایی نموداری توی پستا میزارم.

تا اینجای کار نشون دادم که توضیع حروف انگلیسی توی یه متن استاندارد یکنواخت نیستو غیر یکنواختیش الگو داره.

نمودار توضیع:

resim

و یه متن هست که با یه کلید تک حرفی به روش ویگنر قفل شده:

Yk pqmd Eyuft U saf ftq Etqdxaow Taxyqe egssqefuaz ngf zaf ftq aftqd azq. U rqmd U omz'f ymwq mzkftuzs ar quftqd ar ftqy. Uf'e faa pqxuomfq mzp sqffuzs faa zqmd fa eqxr mphqdfueqyqzf. U'y sxmp fa gzpqdefmzp ftmf ftq eqdumx tme zaf puembbauzfqp kag. Tayq fapmk. Kagde hqdk euzoqdqxk,

M Oazmz Pakxq.





نمودار توزیع حروفش این شکلیه:



resim



با چیزایی که تا اینجا فهمیدیم باید بشه کلید این متنو پیدا کردو دیسایفرش کرد. تا فردا پس فردا تلاش کنین. اگه کسی نتونست (که خیلی بعیده  3 ) جوابشو میزارم.
resim
پاسخ
 سپاس شده توسط Alishia ، Hidden ، Milad ، کارآگاه مرده ، red hat
#10
کلید تک حرفی o عه؟
Try to be mature
پاسخ




کاربرانِ درحال بازدید از این موضوع: 1 مهمان

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