пятница, 29 июня 2012 г.

Реализация метода Гронфельда на python

Думаю многие, начиная изучать программирование, хотели бы написать программы для шифрования данных или взлома компьютерных систем. Взломом я не занимаюсь, а вот помочь написать простую программу для шифрования текста - пожалуйста.
Итак, мы реализуем простой алгоритм – называемый шифром Гронсфельда. Шифр Гронсфельда представляет собой модификацию шифра Цезаря числовым ключом. Для этого под буквами исходного сообщения записывают цифры числового ключа. Если ключ короче сообщения, то его запись циклически повторяют. Шифр-текст получают примерно, как в шифре Цезаря, но отсчитывают по алфавиту не третью букву (как это делается в шифре Цезаря), а выбирают ту букву, которая смещена по алфавиту на соответствующую цифру ключа.
Мы будем использовать для кодирования не только буквы алфавита, но и символы юникода. Наверное, вы все знаете, что каждому символу соответствует специальный код. Чтобы посмотреть воспользуемся встроенными функциями python.
>>> ord(u'А')
1040
И обратное преобразование:
>>> print unichr(1040)
А
В нашем алгоритме мы просто будем сдвигать код символа на значение ключа. Например если значение ключа для данного символа будет 3 (например для ‘А’), то в зашифрованном виде вместо А мы выведем символ с кодом 1043 и тд.
Далее рассмотрим реализацию данного алгоритма на python.
class Grons:
    def __init__(self):
        self.symbol = []
    def code(self, str, key):
        output = ''
        i = 0
        for s in str:
            if s in self.symbol:
                output += s
            else:
                output += unichr(ord(s)+int(input_value[i]))
                if i == len(input_value) - 1:
                    i = 0
                i += 1
        return output
   
    def decode(self, str, key):
        output = ''
        i = 0
        for s in str:
            if s in self.symbol:
                output += s
            else:
                output += unichr(ord(s)-int(input_value[i]))
                if i == len(input_value) - 1:
                    i = 0
                i += 1
        return output
В данном классе у нас реализовано 3 метода: конструктор по умолчанию, метод шифрования и дешифрования.
В конструкторе мы устанавливаем массив символов, которые не нужно заменять. Я оставил его пустым, но можно, например не шифровать пробелы([‘ ‘]).
При шифровании мы передаём строку для шифрования и строку ключа.
Для дешифровки нам нужна получившаяся строка при шифровании и тот же ключ.
Пользоваться классом нужно так:
ex = Grons()
codetext = ex.code(u'''вкусный тор
                    алый red''', '2178')
print codetext
print ex.decode(dec, '2178')
Результатом выполнения будет:
дсфщфьс'уцч('!('!('!('!('!('!('буђк(yfl

вкусный тор
                    алый red
Чтобы запретить шифрование пробелов и переносов строк изменим конструктор на:
    def __init__(self):
        self.symbol = [' ','\r','\n']
В результате строка после шифрования будет выглядеть следующим образом:
дсфщфьс щпш

     змѓр smk
В данный статье был рассмотрен один из самых простых алгоритмов для шифрования текста. Он не отличается высокой криптостойкостью. Однако в некоторых случаях может пригодиться. Использование его оправдано, когда передаваемая зашифрованная информация быстро теряет актуальность, тогда даже в случаи подбора ключа, информация уже успеет устареть и никакого вреда не будет.
Оригинал статьи читаем тут, а так же другие интересные и полезные статьи на моём блоге.

0 коммент.:

Отправить комментарий

TROCKII БЛОГ Copyright © 2012 | Template created by Lev Trockii |