<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 <title>@ch3sh1r blogs.</title>
 <link href="http://ch3sh1r.github.io/atom.xml" rel="self"/>
 <link href="http://ch3sh1r.github.io/"/>
 <updated>2015-07-19T09:04:58+00:00</updated>
 <id>http://ch3sh1r.github.io/</id>
 <author>
   <name>Alexey Bednyakov</name>
 </author>
 
 <entry>
   <title>Класс Text</title>
   <link href="http://ch3sh1r.github.io//posts/jdege-text"/>
   <updated>2012-03-11T00:00:00+00:00</updated>
   <id>http://ch3sh1r.github.io//posts/jdege-text</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Вы видите перед собой вольный перевод &lt;a href=&quot;http://jdege.us/
crypto-python/index.html&quot;&gt;курса&lt;/a&gt; за авторством Jeffrey Dege.
Это значит, что все права на текст принадлежат автору, а в ошибках,
скорее всего, стоит винить переводчика.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;section&quot;&gt;Содержание&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege&quot;&gt;Введение&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-python&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-cryptography&quot;&gt;Криптография&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-text&quot;&gt;&lt;b&gt;Класс Text&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Класс Encryption&lt;/li&gt;
&lt;li&gt;Криптоанализ I - Ряд Цифр&lt;/li&gt;
&lt;li&gt;Криптоанализ II - Хитрость&lt;/li&gt;
&lt;li&gt;Криптоанализ III - Точность&lt;/li&gt;
&lt;li&gt;Создание программ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Программировать будем от конца к началу, то есть с целью сломать Monome-Dinome 
мы сначала напишем программу для шифрования открытого текста. Затем 
напишем программу для расшифрования по известному ключу. &lt;/p&gt;

&lt;p&gt;Практически всегда исследование нового типа шифра начинается с создания 
процедур шифрования и расшифрования. Это ведет к четкому пониманию работы 
шифра и позволяет проверить правильность этого понимания. Ну и, в конце 
концов, дает возможность создания неограниченного количества шифротекстов 
для анализа. &lt;/p&gt;

&lt;p&gt;И только завершив с шифровкой/расшифровкой, мы приступим к методам 
идентификации номеров строк и перевода шифротекста к легко 
взламываему виду.&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;Первый объект&lt;/h3&gt;

&lt;p&gt;Наконец-то мы переходим от разглагольствований к программированию. Для 
начала нам понадобится кусочек открытого текста, например вот такой: 
“As soon as we started programming, we found 
to our surprise that it wasn’t as easy to get programs right as we had thought. 
Debugging had to be discovered. I can remember the exact instant when I realized that a 
large part of my life from then on was going to be spent in finding mistakes in my 
own programs.” Maurice Wilkes, конструктор EDSAC, 1949.&lt;/p&gt;

&lt;p&gt;Запускайте свой интерпретатор и присвойте переменной &lt;code&gt;plaintext&lt;/code&gt; эту цитату: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Python 2.4.3 (#1, Jan 21 2009, 01:10:13) 
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux2
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.
&amp;gt;&amp;gt;&amp;gt; plaintext = &#39;&#39;&#39;As soon as we started programming, we found to our surprise that it wasn&#39;t
as easy to get programs right as we had thought.  Debugging had to be
discovered.  I can remember the exact instant when I realized that a large
part of my life from then on was going to be spent in finding mistakes in
my own programs.&#39;&#39;&#39;
&amp;gt;&amp;gt;&amp;gt; print plaintext
As soon as we started programming, we found to our surprise that it wasn&#39;t
as easy to get programs right as we had thought.  Debugging had to be
discovered.  I can remember the exact instant when I realized that a large
part of my life from then on was going to be spent in finding mistakes in
my own programs.
&amp;gt;&amp;gt;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Маленькое отступление. Автор и далее с успехом продолжает использовать интерпретатор 
напрямую. Мы же, как дети более светлого времени, воспользуемся достижениями мысли 
человеческой. А именно, перейдем на использование замены стандартного Python shell’а — 
&lt;a href=&quot;http://ipython.org/&quot;&gt;iPython&lt;/a&gt;. На повествование это никак не повлияет, но даст 
нам всякие фишки вроде доступной истории команд и автокомплита по коду (а при 
желании и многие &lt;a href=&quot;http://habrahabr.ru/blogs/python/117608/&quot;&gt;другие&lt;/a&gt;). Итак, &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; ipython
Python 2.7.2+ (default, Oct  4 2011, 20:03:08) 
Type &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.

IPython 0.10.2 -- An enhanced Interactive Python.
?         -&amp;gt; Introduction and overview of IPython&#39;s features.
%quickref -&amp;gt; Quick reference.
help      -&amp;gt; Python&#39;s own help system.
object?   -&amp;gt; Details about &#39;object&#39;. ?object also works, ?? prints more.

In [1]: plaintext = &#39;&#39;&#39;As soon as we started programming, we found to our surprise that it wasn&#39;t
   ...:     as easy to get programs right as we had thought.  Debugging had to be
   ...:     discovered.  I can remember the exact instant when I realized that a large
   ...:     part of my life from then on was going to be spent in finding mistakes in
   ...:     my own programs.&#39;&#39;&#39;

In [2]: print plaintext
As soon as we started programming, we found to our surprise that it wasn&#39;t
    as easy to get programs right as we had thought.  Debugging had to be
    discovered.  I can remember the exact instant when I realized that a large
    part of my life from then on was going to be spent in finding mistakes in
    my own programs.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Как и в большинстве других языков программирования, в Python кавычки использованы для 
объявления строк. Но есть один нюанс — кавычки бывают двух типов. Тройные кавычки 
(&lt;code&gt;&#39;&#39;&#39;&lt;/code&gt; и &lt;code&gt;&quot;&quot;&quot;&lt;/code&gt;) используются для строк, содержащих символ новой строки &lt;code&gt;\n&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Так вот, наш открытый текст содержится в объекте строкового типа с именем &lt;code&gt;plaintext&lt;/code&gt;.
Теперь можно работать с этой строкой средствами Python, например привести 
к верхнему регистру или посчитать длину:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [3]: print plaintext.upper()
AS SOON AS WE STARTED PROGRAMMING, WE FOUND TO OUR SURPRISE THAT IT WASN&#39;T
    AS EASY TO GET PROGRAMS RIGHT AS WE HAD THOUGHT.  DEBUGGING HAD TO BE
    DISCOVERED.  I CAN REMEMBER THE EXACT INSTANT WHEN I REALIZED THAT A LARGE
    PART OF MY LIFE FROM THEN ON WAS GOING TO BE SPENT IN FINDING MISTAKES IN
    MY OWN PROGRAMS.

In [4]: len(plaintext)
Out[4]: 326
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Это конечно хорошо, но наш &lt;code&gt;plaintext&lt;/code&gt; не является строкой в интуитивном 
смысле. Разумеется в скором времени мы будем оперировать им как строкой, 
но сейчас необходима другая абстракция, способная вместить операции 
не принадлежащие к классу строковых. Попробуем определить класс &lt;code&gt;Text&lt;/code&gt;, 
в который наша “нестрока” будет вписываться.&lt;/p&gt;

&lt;p&gt;Обратите внимание — класс назван &lt;code&gt;Text&lt;/code&gt; а не &lt;code&gt;Plaintext&lt;/code&gt;, о котором идет 
речь. Это осмысленное действие — на данном этапе нет причин разделять эти 
понятия. А &lt;a href=&quot;http://ru.wikipedia.org/wiki/Бритва_Оккама&quot;&gt;привлечение&lt;/a&gt; 
новых сущностей без необходимости часто приводит к серьезным ошибкам. &lt;/p&gt;

&lt;p&gt;Итак, наш первый класс: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [5]: class Text:
   ...:     def __init__(self, text):
   ...:         self.text = text
   ...:         
   ...:         

In [6]: pt = Text(plaintext)

In [7]: pt
Out[7]: &amp;lt;__main__.Text instance at 0x98a29ac&amp;gt;

In [8]: print pt.text
As soon as we started programming, we found to our surprise that it wasn&#39;t
    as easy to get programs right as we had thought.  Debugging had to be
    discovered.  I can remember the exact instant when I realized that a large
    part of my life from then on was going to be spent in finding mistakes in
    my own programs.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Класс — это контейнер для данных и методов работы с этими данными. 
Наш &lt;code&gt;Text&lt;/code&gt; состоит из переменной &lt;code&gt;text&lt;/code&gt; и метода &lt;code&gt;__init__()&lt;/code&gt;. &lt;code&gt;__init__()&lt;/code&gt; — 
кодовое слово языка Python, это функция выполняющаяся при инициализации
объекта. То есть конструкция &lt;code&gt;pt = Text(plaintext)&lt;/code&gt; присваивает переменной 
&lt;code&gt;text&lt;/code&gt; класса &lt;code&gt;pt&lt;/code&gt; значение переменной &lt;code&gt;plaintext&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;А нужна вся это объектная ориентированность для возможности на лету 
конструировать много объектов со схожими свойствами:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [9]: pt2 = Text(&quot;Another text&quot;)

In [10]: pt2.text
Out[10]: &#39;Another text&#39;

In [11]: print pt.text
As soon as we started programming, we found to our surprise that it wasn&#39;t
    as easy to get programs right as we had thought.  Debugging had to be
    discovered.  I can remember the exact instant when I realized that a large
    part of my life from then on was going to be spent in finding mistakes in
    part of my life from then on was going to be spent in finding mistakes in
    my own programs.
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Но эти объекты существуют только в памяти интерпретатора и превратятся 
в историю сразу после выхода. Если же нам необходимо использовать их 
и в дальнейшем — стоит оформить их в модуль. &lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;Первый модуль&lt;/h3&gt;

&lt;p&gt;Модуль — это текстовый файл, содержащий код Python. Большая часть этого файла — 
описание классов/функций, и лишь маленький кусочек — инструкции по работе с ними. 
Чтобы создать модуль, откроем любимый текстовый редактор и запишем следущее: &lt;/p&gt;

&lt;div class=&quot;highlight&quot;&gt;&lt;pre&gt;&lt;code class=&quot;language-python&quot; data-lang=&quot;python&quot;&gt;&lt;span class=&quot;k&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;nc&quot;&gt;Text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;:&lt;/span&gt;
    &lt;span class=&quot;k&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;nf&quot;&gt;__init__&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;span class=&quot;p&quot;&gt;):&lt;/span&gt;
        &lt;span class=&quot;bp&quot;&gt;self&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;n&quot;&gt;text&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;n&quot;&gt;text&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Теперь сохраняем все это под именем &lt;code&gt;crypto.py&lt;/code&gt; в той же директории из которой 
запускаем iPython. Отныне командой &lt;code&gt;from crypto import *&lt;/code&gt; мы возвращаем 
все наши объекты к жизни: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [1]: from crypto import *

In [2]: pt = Text(&quot;This is a text&quot;)

In [3]: print pt.text
This is a text
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Осталось заметить, что такой метод импорта расходится с Дао Python, в котором 
пространства имен провозглашаются неплохой идеей (я вполне серьезен, попробуйте 
дать интерпретатору команду &lt;code&gt;import this&lt;/code&gt;). Правильнее поступать так:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [1]: import crypto

In [2]: pt = crypto.Text(&quot;This is another text&quot;)

In [3]: print pt.text
This is another text
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;section-3&quot;&gt;Загрузка из файла&lt;/h3&gt;

&lt;p&gt;Теперь нет необходимости перепечатывать определение нашего класса при каждом 
запуске интерпретатора. Хочется что-то похожее сделать и с открытым текстом. 
Было бы неплохо хранить его в файле и считывать при необходимости. 
Для претворения этого плана в жизнь файл &lt;code&gt;crypto.py&lt;/code&gt; должен выглядеть 
как то так:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Text:
    def __init__(self, filename):
        self.text = &quot;&quot;

    def load(self, filename):
        fp = open(filename)
        self.text = fp.read()
        fp.close

    def __str__(self):
        return self.text
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Здесь &lt;code&gt;__str__()&lt;/code&gt; — еще одно ключевое слово, за которым следует описание 
поведения нашего класса в строковом контексте. А контекст — очередная 
фишка интерпретируемых языков программирования. Если коротко, это 
значит что язык не будет морочить голову программисту объемными описаниями, 
додумывая все очевидное за него.&lt;/p&gt;

&lt;p&gt;Запишем исследуемую цитату в файл, назовем его &lt;code&gt;plain.txt&lt;/code&gt; и опробуем 
на нем новый модуль: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [4]: reload(crypto)
Out[4]: &amp;lt;module &#39;crypto&#39; from &#39;crypto.pyc&#39;&amp;gt;

In [5]: pt = crypto.Text(&quot;plain.txt&quot;)

In [6]: print pt
As soon as we started programming, we found to our surprise that it wasn&#39;t
as easy to get programs right as we had thought.  Debugging had to be
discovered.  I can remember the exact instant when I realized that a large
part of my life from then on was going to be spent in finding mistakes in
my own programs.
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;section-4&quot;&gt;Форматирование вывода&lt;/h3&gt;

&lt;p&gt;Изучаемый открытый текст содержит символы, часть которых никак не меняется 
при шифровании. Пробелы, пунктуация, escape-символы нам не интересны — 
значит в процессе исследования их следует отбросить. Кое-какие методы работы 
со строками нам уже известны, так напишем же с их помощью функцию конвертирования 
текста в необходимую форму: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Text:
    def __init__(self, filename):
        self.load(filename)

    def load(self, filename):
        fp = open(filename)
        self.rawtext = fp.read()
        fp.close
        self.text = self.convert(self.rawtext)

    def convert(self, txt):
        rval = &quot;&quot;
        for c in txt.upper():
            if c.isalpha():
                rval += c
        return rval

    def __str__(self):
        return self.text
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Теперь метод &lt;code&gt;__str__()&lt;/code&gt; возвращает все буквы из текста в верхнем регистре: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [7]: reload(crypto)
Out[7]: &amp;lt;module &#39;crypto&#39; from &#39;crypto.pyc&#39;&amp;gt;

In [8]: pt = crypto.Text(&quot;plain.txt&quot;)

In [9]: print pt
ASSOONASWESTARTEDPROGRAMMINGWEFOUNDTOOURSURPRISETHATITWASNTASEASYTOGETPROGRAMSRIGHTASWEHADTHOUGHTDEBUGGINGHADTOBEDISCOVEREDICANREMEMBERTHEEXACTINSTANTWHENIREALIZEDTHATALARGEPARTOFMYLIFEFROMTHENONWASGOINGTOBESPENTINFINDINGMISTAKESINMYOWNPROGRAMS
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;С этим уже можно работать. Осталось только чуть-чуть подкорректировать вывод 
так, чтобы одновременно не мешало действиям алгоритма и не резало глаз человека. 
Пусть &lt;code&gt;__str__()&lt;/code&gt; печатает группами по пять символов, по двенадцать групп 
в строку: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def __str__(self):
    rval = &quot;&quot;
    pos = 0
    for c in self.text:
        rval += c
        pos += 1
        if pos % 60 == 0:
            rval += &#39;\n&#39;
        elif pos % 5 == 0:
            rval += &quot; &quot;
    return rval
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Компактно и внушает уважение наблюдателям.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;In [10]: reload(crypto)
Out[10]: &amp;lt;module &#39;crypto&#39; from &#39;crypto.pyc&#39;&amp;gt;

In [11]: pt = crypto.Text(&quot;plain.txt&quot;)

In [12]: print pt
ASSOO NASWE START EDPRO GRAMM INGWE FOUND TOOUR SURPR ISETH ATITW ASNTA
SEASY TOGET PROGR AMSRI GHTAS WEHAD THOUG HTDEB UGGIN GHADT OBEDI SCOVE
REDIC ANREM EMBER THEEX ACTIN STANT WHENI REALI ZEDTH ATALA RGEPA RTOFM
YLIFE FROMT HENON WASGO INGTO BESPE NTINF INDIN GMIST AKESI NMYOW NPROG
RAMS
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;section-5&quot;&gt;Первая программа&lt;/h3&gt;

&lt;p&gt;Вначале курса упоминалось, что есть еще один способ запуска — как 
обычного исполняемого файла. Он выполнен как передача интерпретатору файла 
с исходным кодом в виде аргумента из командной строки. А в некоторых 
средах можно обойтись и без упоминания интерпретатора, оставив его координаты 
в исходниках.&lt;/p&gt;

&lt;p&gt;Такое можно проделать и с нашим &lt;code&gt;crypto.py&lt;/code&gt;, правда он пока не способен на 
внятные самостоятельные действия. По вызову он просто создает описанные классы 
и отключается. Вроде бы осталось только описать необходимые действия, 
но тогда они будут выполняться каждый раз как мы импортируем программу в 
качестве модуля. Чтобы такого не происходило, введем в использование 
еще парочку кодовых слов Python: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;if __name__ == &quot;__main__&quot;:
    txt = Text(&#39;plain.txt&#39;)
    txt.load(&#39;plain.txt&#39;)
    print txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Переменная &lt;code&gt;__main__&lt;/code&gt; принимает значение &lt;code&gt;&quot;__name__&quot;&lt;/code&gt; только когда 
файл исполняется интерпретатором. Это и позволяет использовать написанные 
программы как библиотеки а библиотеки как программы. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; python crypto.py
ASSOO NASWE START EDPRO GRAMM INGWE FOUND TOOUR SURPR ISETH ATITW ASNTA
SEASY TOGET PROGR AMSRI GHTAS WEHAD THOUG HTDEB UGGIN GHADT OBEDI SCOVE
REDIC ANREM EMBER THEEX ACTIN STANT WHENI REALI ZEDTH ATALA RGEPA RTOFM
YLIFE FROMT HENON WASGO INGTO BESPE NTINF INDIN GMIST AKESI NMYOW NPROG
RAMS
&amp;gt;&amp;gt;       
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;И добавим очевидное — пусть имя обрабатываемого файла передается как параметр: &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env python
import sys

#...тут все без изменений...

if __name__ == &quot;__main__&quot;:
    if len(sys.argv) == 2:
        txt = Text(sys.argv[1])
    else:
        print &quot;Usage: crypto.py &amp;lt;filename&amp;gt;&quot;
        sys.exit(1)
    print txt
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Итак, всего два нововведения. Во-первых, мы добавили юниксовый 
“shebang” комментарий, который и позволяет в Unix запускать программу не передавая 
ее интерпретатору напрямую. Для Windows это не обязательно. 
Там решающим фактором становится расширение, и файл оканчивающийся на 
&lt;code&gt;.py&lt;/code&gt; будет автоматически передан интерпретатору. &lt;/p&gt;

&lt;p&gt;Во-вторых, импортирован модуль &lt;code&gt;sys&lt;/code&gt;. Это стандартный модуль который 
поставляется с каждой установкой Python. Он содержит функции и переменные 
для создания интерфейса по работе с операционной системой. В нашем случае, 
он использован для получения аргументов командной строки при запуске 
нашей программы и для выхода при получении незапланированных аргументов. 
Переменная &lt;code&gt;sys.argv&lt;/code&gt; указывает на массив строк, нулевой элемент которого — 
имя запущенной программы, а первый содержит единственный в нашем случае 
аргумент. &lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; python ./crypto.py
Usage: crypto.py &amp;lt;filename&amp;gt;
&amp;gt;&amp;gt; python crypto.py plain.txt 
ASSOO NASWE START EDPRO GRAMM INGWE FOUND TOOUR SURPR ISETH ATITW ASNTA
SEASY TOGET PROGR AMSRI GHTAS WEHAD THOUG HTDEB UGGIN GHADT OBEDI SCOVE
REDIC ANREM EMBER THEEX ACTIN STANT WHENI REALI ZEDTH ATALA RGEPA RTOFM
YLIFE FROMT HENON WASGO INGTO BESPE NTINF INDIN GMIST AKESI NMYOW NPROG
RAMS
&amp;gt;&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;
</content>
 </entry>
 
 <entry>
   <title>Криптография</title>
   <link href="http://ch3sh1r.github.io//posts/jdege-cryptography"/>
   <updated>2012-03-10T00:00:00+00:00</updated>
   <id>http://ch3sh1r.github.io//posts/jdege-cryptography</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Вы видите перед собой вольный перевод &lt;a href=&quot;http://jdege.us/
crypto-python/index.html&quot;&gt;курса&lt;/a&gt; за авторством Jeffrey Dege.
Это значит, что все права на текст принадлежат автору, а в ошибках,
скорее всего, стоит винить переводчика.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;section&quot;&gt;Содержание&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege&quot;&gt;Введение&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-python&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-cryptography&quot;&gt;&lt;b&gt;Криптография&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-text&quot;&gt;Класс Text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Класс Encryption&lt;/li&gt;
&lt;li&gt;Криптоанализ I - Ряд Цифр&lt;/li&gt;
&lt;li&gt;Криптоанализ II - Хитрость&lt;/li&gt;
&lt;li&gt;Криптоанализ III - Точность&lt;/li&gt;
&lt;li&gt;Создание программ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Предполагается, что вы и без этого курса понимаете основы и ориентируетесь в терминологии 
криптографии. Например, знаете о частотном анализе и понимаете метод его 
применения для взлома шифра простой подстановки. Если таких знаний нет — стоит 
сначала почитать что-нибудь из перечисленного в следующем параграфе.&lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;Литература&lt;/h3&gt;

&lt;p&gt;В сети не так много обучающих крптографии материалов хорошего качества, как для
Python:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.quadibloc.com/crypto/pp0101.htm&quot;&gt;Cryptanalyzing the Simple Substitution Cipher&lt;/a&gt;, из John Savard “A Cryptographic 
Compendium”&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.simonsingh.net/The_Black_Chamber/crackingsubstitution.html&quot;&gt;Cracking The Substitution Cipher&lt;/a&gt;, из 
Simon Singh “The Code Book”&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.und.nodak.edu/org/crypto/crypto/lanaki.crypt.class/lessons/lesson01.zip&quot;&gt;Lecture 1&lt;/a&gt;, 
из Lanaki Classical Cryptography Course&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для начинающих программистов Mike Cowan написал курс по использованию Python в 
криптографических целях: &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://web.mac.com/mikejcowan/Ciphers/1._Introduction.html&quot;&gt;Learning to program in python for novice programmers and cipher enthusiasts&lt;/a&gt;. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Если вы никогда ранее не программировали, то этот курс — неплохой повод начать. 
Он (в смысле курс) начинает с введения простейших понятий языков программирования, 
а в конце приводит к созданию программы для решения многих шифров простой 
подстановки. 
И, под конец, упомянем несколько готовых решений для анализа шифров подстановки: &lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://rumkin.com/tools/cipher/cryptogram.php&quot;&gt;Rumkin Cryptogram Assistant&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://www.blisstonia.com/software/WebDecrypto/&quot;&gt;Decrypto 8.5&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;monome-dinome&quot;&gt;Шифр Monome-Dinome&lt;/h3&gt;

&lt;p&gt;Для демонстрации криптоаналитических способностей Python нам потребуется шифр. 
Будем использовать Monome-Dinome от Американской Ассоциации Криптограмм 
(или American Cryptogram Association, далее по тексту ACA). Это такой 
шифры, в которых знак исходного текста иногда заменяются знаком, а иногда 
парой знаков (то есть замена моно- и биграммами). Самым знаменитым в этом 
классе является Straddling Checkerboard. Основная идея состоит в попытке 
скрыть информацию о частоте с целью усложнить взлом. Ни один из таких 
шифров нельзя назвать сильным, а Monome-Dinome к тому же содержит в 
себе уязвимость, которая позволяет взломать его довольно просто .&lt;/p&gt;

&lt;p&gt;Ключом является перемешанный алфавит, записанный в матрицу 3х8, столбцы&lt;br /&gt;
которой нумеруются случайным образом восемью однозначными числами, два
оставшихся числа приписываются двум последним строкам. Первая строка остается 
ненумерованной. Пример:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;. 6 2 7 0 4 8 3 9
. P B N E C O R D
5 Q I F U S G V T
1 H X A K Y L M Z
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Процесс шифрования прост. Каждая буква открытого текста располагается 
где-то в таблице. Если она в первой строке — заменяем ее номером столбца. 
Если нет — заменяем парой (номер столбца, номер строки).&lt;/p&gt;

&lt;p&gt;Тогда, в нашем примере буква &lt;code&gt;P&lt;/code&gt; шифруется как &lt;code&gt;6&lt;/code&gt;, а буква &lt;code&gt;Q&lt;/code&gt; как &lt;code&gt;56&lt;/code&gt;. 
Текст &lt;code&gt;ATTACK AT DAWN&lt;/code&gt; превратится в &lt;code&gt;17 59 59 17 4 10 17 59 9 17 53 7&lt;/code&gt;, 
или в &lt;code&gt;17595 91741 01759 91753 7&lt;/code&gt;, если записать группами из 5 цифр.
Заметьте, что буква &lt;code&gt;W&lt;/code&gt; воспринимается как синоним к &lt;code&gt;V&lt;/code&gt; и шифруется 
как &lt;code&gt;53&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Плюс такой замены в размытой связи между открытым текстом и шифротекстом. 
По цифре в шифротексте невозможно определить — является ли она букву или 
входит в пару с правой или левой цифрой. А очевидная слабость Monome-Dinome от
ACA в том, что цифры из номера строки никогда не появятся в номере столбца, 
и наоборот. Это создает легко узнаваемые статистические шаблоны. А обнаружение 
подобного шаблона однозначно ведет к компроментации шифротекста.
Другие шифры с подобным методом замены, в том числе и Straddling Chessboard, 
лишены этого недостатка. Например, в такой:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;. 6 2 7 5 0 4 8 1 3 9
. P B N . E C O . R D
5 Q F J U S G V T I W
1 H X A K Y L M Z . .
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;решетке цифры &lt;code&gt;1&lt;/code&gt; и &lt;code&gt;5&lt;/code&gt; встречаются как в номерах строк, так и в номерах 
столбцов. И при этом они не могут появиться в одиночку, всегда участвуя в 
паре.&lt;/p&gt;

&lt;p&gt;Приобретя дополнительную сложность, в сердцевине шифр Monome-Dinome является 
обычным шифром простой подстановки. Но как только взломщик узнает о природе 
этой дополнительной сложности, он без труда сможет свести задачу взлома 
Monome-Dinome к задаче взлома простой подстановки, которую достаточно просто 
решить. Эта техника — отбрасывание слоев сложности до сведения к простой 
абстракции — является основой для большого числа методов криптоанализа 
более сложных шифров. А шифр Monome-Dinome от ACA — легкая мишень для такой 
методики, из-за чего он и выбран в качестве примера.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Python</title>
   <link href="http://ch3sh1r.github.io//posts/jdege-python"/>
   <updated>2012-03-05T00:00:00+00:00</updated>
   <id>http://ch3sh1r.github.io//posts/jdege-python</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Вы видите перед собой вольный перевод &lt;a href=&quot;http://jdege.us/
crypto-python/index.html&quot;&gt;курса&lt;/a&gt; за авторством Jeffrey Dege.
Это значит, что все права на текст принадлежат автору, а в ошибках,
скорее всего, стоит винить переводчика.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;section&quot;&gt;Содержание&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege&quot;&gt;Введение&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-python&quot;&gt;&lt;b&gt;Python&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-cryptography&quot;&gt;Криптография&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-text&quot;&gt;Класс Text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Класс Encryption&lt;/li&gt;
&lt;li&gt;Криптоанализ I - Ряд Цифр&lt;/li&gt;
&lt;li&gt;Криптоанализ II - Хитрость&lt;/li&gt;
&lt;li&gt;Криптоанализ III - Точность&lt;/li&gt;
&lt;li&gt;Создание программ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Python — скриптовый язык. На практике, это во-первых значит что он &lt;a href=&quot;http://ru.wikipedia.org/wiki/Интерпретируемый_язык_программирования&quot;&gt;интерпретируем&lt;/a&gt;
Во-вторых что язык заточен для быстрой автоматизации “бытовых” программистских задач. 
История Unix пестрит такими языками: от Bourne Shell к AWK и затем к PERL или TCL. 
Есть сикриптовые языки и на других платформах: JCL и REXX для мейнфреймах IBM, 
AppleScript на Macintosh, PowerShell на Windows и другие.&lt;/p&gt;

&lt;p&gt;Python обладает набором фишек, характерных для скриптовых языков. Он может 
работать интерактивно, что круто в исследовательском программировании. 
Python не требует существования программы в виде единого файла, что позволяет 
не напрягаясь использовать уже написанный код в новых приложениях. 
И, пожалуй самое важное, это язык, подталкивающий к конструированию 
элегантных структур данных и объектов, как объединение кода и данных, 
приводящее к легкому проектированию проблемы в программу. &lt;/p&gt;

&lt;h3 id=&quot;section-1&quot;&gt;Литература&lt;/h3&gt;

&lt;p&gt;Повторюсь, этот курс не концентрируется на базовых основах языка Python. Если вы 
не знакомы с этим языком, стоит посмотреть специальные курсы, многие из которых 
доступны в сети. Jeffrey советует такие:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;Swaroop C H “A Byte of Python”&lt;/li&gt;
  &lt;li&gt;Allen B. Downey “Think Python, How to think like a Computer Scientist” &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;От себя добавлю “&lt;a href=&quot;http://www.diveintopython.net/&quot;&gt;Dive into Python&lt;/a&gt;”, частично переведенный 
на &lt;a href=&quot;http://diveinto.python.ru/toc.html&quot;&gt;русский&lt;/a&gt; и “&lt;a href=&quot;http://www.python.ru/files/book-ods.pdf&quot;&gt;Язык программирования Python&lt;/a&gt;”, в создании которого участвовал Гвидо ван 
Россум, создатель языка.&lt;/p&gt;

&lt;h3 id=&quot;section-2&quot;&gt;Три способа запуска кода&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Напечатать в интерпретаторе&lt;/li&gt;
&lt;li&gt;Сохранить в файл и передать интерпретатору&lt;/li&gt;
&lt;li&gt;Сохранить в файл и вызвать сохраненное из другой программы&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Первый способ — могучая способность Python’а и многих других интерпретируемых языков. 
В миру это приятная возможность выдрать кусок кода и рассмотреть под лупой как он 
работает (или не работает, да).&lt;/p&gt;

&lt;p&gt;Второй очевиден — как только мы добились от кода необходимых результатов, мы его 
сохраняем и затем запускаем раз за разом.&lt;/p&gt;

&lt;p&gt;Существует широкий класс задач, общий для разных программ. Отсюда необходимость в 
возможности писать код, обслуживающий такие задачи, и использовать его в других 
приложениях без применения копипаста.&lt;/p&gt;

&lt;p&gt;Большинство компилируемых языков предлагают последние два способа и ни один первый 
(это можно смело утверждать, не смотря на техническую возможность некоторых IDE 
для компилируемых языков отлаживать код по кускам). 
Большинство же интерпретируемых языков умеют только первые два, и лишь некоторые третий.
Python покрывает все три и в довесок позволяет использовать сохраненный код не только 
как приложение или библиотеку, но и вызвать его из интерпретатора. Что, кстати, мы и 
будем заниматься в этом курсе.&lt;/p&gt;
</content>
 </entry>
 
 <entry>
   <title>Введение</title>
   <link href="http://ch3sh1r.github.io//posts/jdege"/>
   <updated>2012-03-02T00:00:00+00:00</updated>
   <id>http://ch3sh1r.github.io//posts/jdege</id>
   <content type="html">&lt;blockquote&gt;
  &lt;p&gt;Вы видите перед собой вольный перевод &lt;a href=&quot;http://jdege.us/
crypto-python/index.html&quot;&gt;курса&lt;/a&gt; за авторством Jeffrey Dege.
Это значит, что все права на текст принадлежат автору, а в ошибках,
скорее всего, стоит винить переводчика.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3 id=&quot;section&quot;&gt;Содержание&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege&quot;&gt;&lt;b&gt;Введение&lt;/b&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-python&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-cryptography&quot;&gt;Криптография&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/posts/jdege-text&quot;&gt;Класс Text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Класс Encryption&lt;/li&gt;
&lt;li&gt;Криптоанализ I - Ряд Цифр&lt;/li&gt;
&lt;li&gt;Криптоанализ II - Хитрость&lt;/li&gt;
&lt;li&gt;Криптоанализ III - Точность&lt;/li&gt;
&lt;li&gt;Создание программ&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Этот курс — не введение в программирование или криптографию для новичков.
Это базовые концепции проектирования программ способных взламывать некоторые &lt;code&gt;классические
шифры&lt;/code&gt;. Простой тест, вы:&lt;/p&gt;

&lt;ol&gt;
  &lt;li&gt;(y/n) Ничего не слышали о программировании&lt;/li&gt;
  &lt;li&gt;(y/n) В первый раз видите слова &lt;code&gt;язык программирования&lt;/code&gt; и &lt;code&gt;Python&lt;/code&gt; в одном словосочетании&lt;/li&gt;
  &lt;li&gt;(y/n) Никогда не пробовали взломать шифр простой подстановки&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Если что-то из этого подходит под ваше описание — стоит попробовать 
&lt;a href=&quot;http://ch3sh1r.github.com/jdege-python&quot;&gt;почитать&lt;/a&gt; другие
работы, подробно освещающие эти вопросы. С другой стороны, если вы уже читали что-то подобное,
с помощью Питона способны вывести на экран Hello world и любой другой наборы символов, подобрали
пару подстановок — возможно здесь найдется что-нибудь интересное.&lt;/p&gt;

&lt;p&gt;Базовая идея курса состоит в том, что создание программ-кирпичиков для решения
собственных задач и программирование для решения задач чужих — две большие разницы.
Если зайти издалека, задача Серьезного Программиста — создание бензопилы достаточно
безопасной для семилетнего ребенка и одновременно пригодной для решения повседневных задач
сурового лесоруба.&lt;/p&gt;

&lt;p&gt;Говорят, существует такая околоюниксовая поговорка: «Единственная необходимая ошибка — сегфолт»
(имеется в виду &lt;a href=&quot;http://dolzhenko.blogspot.com/2008/10/
segmentation-fault-core-dumped.html&quot;&gt;Segmentation fault: core dumped&lt;/a&gt;).
Такой способ обработки ошибок отрицательно влияет на психику и моральное состояние пользователей,
что, с одной стороны, довольно забавно, но и обременительно с другой. Создание интуитивного
интерфейса и вытекающая из этого проблема качественной обработки ошибок — задачи подчас более
сложные чем описание алгоритма программы. Очевидно и гибкость итогового продукта страдает от такого
подхода.&lt;/p&gt;

&lt;p&gt;Из этих нехитрых мысленных построений следует простой вывод — присутствие способности к
написанию программ, наличие исходного кода путем позволения системе указывать на строчки с неверными
инструкциями дает неслабый прирост эффективности.&lt;/p&gt;

&lt;p&gt;Пару десятков лет назад, когда большинство пользователей были программистами, книги компьютерной тематики
писались именно с уклоном в эту сторону. Unix придуман и воплощен как средство повышения продуктивности
программистов. Серьезные труды по исследованию подобных концепций написаны командой исследователей из
Bell Labs, создателей упомянутого unix’а:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;The Unix Programming Environment (Brian W. Kernighan and Rob Pike. Prentice Hall, Inc., 1984.)&lt;/li&gt;
  &lt;li&gt;Software Tools (Brian W. Kernighan amd P. J. Plauger, Addison-Wesley, 1976.)&lt;/li&gt;
  &lt;li&gt;Programming Pearls (Jon Bentley, Addison-Wesley, 1986.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Да и после этого не мало копий сломано в дискуссиях. А программирование тем временем стало массовой
сферой, сконцентрировавшейся на написании приложений для пользователей.&lt;/p&gt;
</content>
 </entry>
 
</feed>
