- Шифратор
- Python-сообщество
- #1 Дек. 16, 2014 11:38:46
- HELP! шифр Гронсфельда
- Saved searches
- Use saved searches to filter your results more quickly
- IkigaiYoshi/AnalysisOfGronsfeldCipher
- Name already in use
- Sign In Required
- Launching GitHub Desktop
- Launching GitHub Desktop
- Launching Xcode
- Launching Visual Studio Code
- Latest commit
- Git stats
- Files
- README.md
- Шифр Гронсфельда
- Описание [ править ]
- Ключ [ править ]
- Шифрование [ править ]
- Дешифрирование [ править ]
- Пример [ править ]
- Ключ [ править ]
- Шифрование [ править ]
- Дешифрование [ править ]
- Реализация [ править ]
- Python [ править ]
Шифратор
Привет форумчане, сам занимался программированием но потом забил из-за недостатка времени.
Конкретно в Python я не очень, а если точнее вообще не шарю. Могу решать только самые простые и элементарные задачи, но вот мой препод подкинул мне такую задачу, и честно — понятия не имею как с ней справиться.
Сама задача:
Написать программу, которая позволяет зашифровать и расшифровать сообщение написанное на русском языке, следующими шифрами: Шифр Цезаря (реализует следующее преобразование текста: каждая буква исходного текста заменяется третьей после нее буквой в алфавите, который считается написанным по кругу.) 2) Шифр Гронсфельда (модификация шифра Цезаря. (Шифрование заключается в том что величина сдвига не является постоянной,а задается ключом (гаммой) 3)Шифр перестановки (выбирается ключ, например, цифра 4,всем символам сообщения представляет перестановку букв следующим образом: сначала буквы с 1, затем с 2, и т.д до 4)
Если у кого найдется время и желание попрактиковаться — пожалуйста решите задачу и по возможности распишите как вы это сделали, что использовали.
Спасибо.
Словарь-шифратор
Создать собственный словарь-шифратор, то есть словарь, где ключ и значение являются символами.
Реализовать шифратор Джеферсона
Реализовать шифратор Джеферсона (http://cryptowiki.net/index.php?title=Шифратор_Джефферсона)
Задача на словари: шифратор/дешифратор
Сгенерировать словарь-шифратор, то есть словарь, где ключ и значение являются символами. Используя.
Шифратор текста методом подстановки
Доброго времени суток! Помогите решить проблему. Мне нужно написать шифратор который, шифрует текст.
Python-сообщество
- Начало
- » Центр помощи
- » HELP! шифр Гронсфельда
#1 Дек. 16, 2014 11:38:46
HELP! шифр Гронсфельда
Написана программка по шифру Гронсфельда, каждую строку необходимо описать и пояснить, что в ней происходит и используется. Особенно важны два блока: шифрование и дешифрование текста. Прошу помощи.
#!/usr/bin/env python
#-*- coding: utf8 -*-
from Tkinter import *
from tkFileDialog import *
from random import randint
class App(object):
def __init__(self):
self.key = [3, 1, 4, 1, 5]
self.root = Tk()
self.btn_open = Button(self.root, command=self.open_file, text = 'Open')
self.btn_open.pack()
self.txt = Text(self.root)
self.txt.pack()
self.btn_enc = Button(self.root, command=self.encode, text = 'Encode')
self.btn_enc.pack()
self.btn_dec = Button(self.root, command=self.decode, text = 'Decode')
self.btn_dec.pack()
def open_file(self):
self.txt.delete('1.0',END)
self.txt.insert(INSERT, askopenfile().read())
def encode(self):
indata=self.txt.get('1.0',END)
outdata = ''
if len(indata)>0 and indata[-1]=='\n':
indata = indata[:-1]
i = 0
for sym in indata:
if sym>='A' and sym outdata+=chr(((ord(sym)-ord('A'))+self.key[i])%(ord('Z')-ord('A')+1)+ord('A'))
elif sym>='a' and sym outdata+=chr(((ord(sym)-ord('a'))+self.key[i])%(ord('z')-ord('a')+1)+ord('a'))
else:
outdata += sym
i += 1
if i == len(self.key):
i = 0
self.txt.delete('1.0',END)
self.txt.insert(INSERT, outdata)
def decode(self):
indata=self.txt.get('1.0',END)
outdata = ''
if len(indata)>0 and indata[-1]=='\n':
indata = indata[:-1]
i = 0
for sym in indata:
if sym>='A' and sym outdata+=chr(((ord(sym)-ord('A'))-self.key[i])%(ord('Z')-ord('A')+1)+ord('A'))
elif sym>='a' and sym outdata+=chr(((ord(sym)-ord('a'))-self.key[i])%(ord('z')-ord('a')+1)+ord('a'))
else:
outdata += sym
i += 1
if i == len(self.key):
i = 0
self.txt.delete('1.0',END)
self.txt.insert(INSERT, outdata)
def on_execute(self):
self.root.mainloop()
if __name__ == '__main__':
app = App()
app.on_execute()
Отредактировано Kristofer1373 (Дек. 16, 2014 20:10:13)
Saved searches
Use saved searches to filter your results more quickly
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Анализ алгоритма Гронсфельда.
IkigaiYoshi/AnalysisOfGronsfeldCipher
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Sign In Required
Please sign in to use Codespaces.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching GitHub Desktop
If nothing happens, download GitHub Desktop and try again.
Launching Xcode
If nothing happens, download Xcode and try again.
Launching Visual Studio Code
Your codespace will open once ready.
There was a problem preparing your codespace, please try again.
Latest commit
Git stats
Files
Failed to load latest commit information.
README.md
Шифр Гронсфельда — полиалфавитный подстановочный шифр, представляет собой модификацию шифра Цезаря числовым ключом. Для этого под буквами исходного сообщения записывают цифры числового ключа. Если ключ короче сообщения, то его запись циклически повторяют. Шифртекст получают примерно, как в шифре Цезаря, но отсчитывают по алфавиту не третью букву (как это делается в шифре Цезаря), а выбирают ту букву, которая смещена по алфавиту на соответствующую цифру ключа.
Данный алгоритм реализован при помощи класса Gronsfeld.
Класс содержит 2 публичных метода:
//реализует шифрование заданного сообщения; std::string encryptText(const std::string &text, const std::string &key);
//реализует расшифровку последовательности; void decryptText(const std::string &text, const std::string &key).
Шифр Гронсфельда «размывает» характеристики частот появления символов в тексте, но некоторые особенности появления символов в тексте остаются. Главный недостаток шифра Гронсфельда состоит в том, что его ключ повторяется. Поэтому простой криптоанализ шифра может быть построен в два этапа:
- Поиск длины ключа. Можно анализировать распределение частот в зашифрованном тексте с различным прореживанием. То есть брать текст, включающий каждую 2-ю букву зашифрованного текста, потом каждую 3-ю и т. д. Как только распределение частот букв будет сильно отличаться от равномерного (например, по энтропии), то можно говорить о найденной длине ключа.
- Криптоанализ. Совокупность L шифров Цезаря (где L — найденная длина ключа), которые по отдельности легко взламываются.
Данный анализ реализован при помощи класса AnalysisOfGronsfeld.
Класс содержит 4 приватных метода и 1 публичного:
//для разделения текста на шифры Цезаря; std::vector divisionText (const std::string &text);
//реализует расшифровку последовательности; char searchKeyForOnePartOfText (const std::string &text);
//предназначен для нахождения длины ключа шифротекста; int findKeyLenght (const std::string &text);
//вычисляет вероятности того, что два случайных элемента текста совпадут //при помощи этого метода происходит вычисление длины текста; float indexOfCoincidence (const std::string &text);
//для пользовательского вызова из главного класса; void decryptText (const std::string &text).
Шифр Гронсфельда
Шифр Гронсфельда — полиалфавитный подстановочный шифр создан графом Гронсвельдом (руководителем первой дешифровальной службы Германии) в XVII веке. Шифр можно считать усовершенствованием шифра Цезаря (надежность) и Виженера / Бофора (скорость).
Описание [ править ]
Ключ [ править ]
Длина ключа (K) должна быть равной длине исходного текста. Для этого циклически записывают ключ до тех пор, пока его длина не будет соответствовать длине исходного текста.
Шифрование [ править ]
Каждый символ Mi открытого текста M нужно на Ki (соответствующий символ ключа K) шагов сдвинуть вправо.
Или пользуясь таблицей Гронсфельда (Tx y, где x — номер строки, а y — номер столбца и отсчет ведется с нуля):
каждый символ Ci шифротекста C находится на пересечении столбца y, первый (заголовочный) символ которого равен соответстуещему символу открытого текста Mi, и Ki-й (соответствующей цифры ключа) строки — (TKi y)
Дешифрирование [ править ]
Каждый символ (Ci) зашифрованого текста C нужно на Ki (соответствующий символ ключа K) шагов сдвинуть влево.
Или пользуясь таблицей Гронсфельда (Tx y, где x — номер строки, а y — номер столбца и отсчет ведется с нуля):
нужно в Ki (i-ая цифра ключа K) строке найти символ, который равен соответствующему символу шифротекста (TKi y = Ci), и первый (заголовочный) элемент столбца будет i-ый символ открытого текста.
Пример [ править ]
Пусть дан исходный текст: C = «GRONSFELD»
и ключ: K = «2015»
Ключ [ править ]
Длина клера — 9 символов, значит и длина ключа также должна равнятся 9 символам.
K = «201520152»
Шифрование [ править ]
Шифротекст (C) — «IRPSUFFQF»
Дешифрование [ править ]
Дешифрованный текст (M) — «GRONSFELD»
Реализация [ править ]
Python [ править ]
A = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * 2 # алфавит def f(mc, k, op): k *= len(mc) // len(k) + 1 return ''.join([A[A.index(j) + int(k[i]) * op] for i, j in enumerate(mc)]) def encrypt(message, key): return f(message, key, 1) def decrypt(ciphertext, key): return f(ciphertext, key, -1) print(encrypt('GRONSFELD', '2015')) # шифрование print(decrypt('IRPSUFFQF', '2015')) # расшифровывание