@WhiteNiBBa

Как написать шифр Плейфера на python?

На лабораторной задали написать шифратор и дешифратор шифра Плейфера. Для начала решил написать шифратор для постоянной матрицы. Но что-то пошло не так. Для понимания работы объясню, как работает шифр. На вход поступает фраза. Далее производятся следующие действия:
1) Если в слове имеются 2 одинаковые буквы, стоящие рядом, то между ними вставляется буква. ( в данном случае "Я")
2) Если кол-во символов во фразе нечетное, то в конец ставится "Я"
3) Фраза делится на условные биграммы
4) В матрице строится условный квадрат, 2-мя противоположными углами которого являются буквы из биграммы.
5) Далее эти буквы заменяются другими, находящимися по углам квадрата(сверху или снизу)
6) Если буквы находятся на одной строке, то сдвигаются вправо на 1 .
7) Если буквы находятся в одном столбце, то меняются на 1 вниз.
8) Фраза собирается обратно
Вот мой код, который некоторые символы шифрует нормально, а некоторые нет
text = input('Введите текст : ')
text = [x for x in text]
res = ''
m = [
    ["Н","И","К","О","Л","А"],
    ["Б","В","Г","Д","Е","Ё"],
    ["Ж","З","Й","М","П","Р"],
    ["С","Т","У","Ф","Х","Ц"],
    ["Ч","Ш","Щ","Ь","Ы","Ъ"],
    ["Э","Ю","Я",".","-","_"],
    ]
for i in range(1,len(text)):
    if text[i] == text[i-1]:
        text.insert(i,'Я')
if len(text)%2 != 0:
    text.append('Я')
for i in range(0,len(text),2):
    a1 = -1; a2 = -1; b1 = -1; b2 = -1
    for a in range(5):
        for b in range(5):
            if a1 == -1:
                if text[i] == m[a][b]:
                    a1 = a; b1 = b
            if a2 == -1:
                if text[i+1] == m[a][b]:
                    a2 = a; b2 = b
    if a1 == a2:
        if b1 == 5 or b2 == 5:
            if b1 == 5:
                b1 = 0
                b2 += 1
            else:
                b2 = 0
                b1 += 1
        
        else :
            b1 += 1
            b2 += 1
    else:
        if b1 == b2:
            if a1 == 5 or a2 == 5:
                if a1 == 5:
                    a1 = 0
                    a2 += 1
                else:
                    a2 = 0
                    a1 += 1
            
            else:
                a1 += 1
                a2 += 1
        else:
            a1,a2 = a2,a1
    res += m[a1][b1]
    res += m[a2][b2]
print(res)
  • Вопрос задан
  • 6168 просмотров
Пригласить эксперта
Ответы на вопрос 2
Dmustache
@Dmustache
Python, Cpp, SQL
Нам его задали, сдать надо сегодня в 22, так что свой код я не буду переписывать, вот он:
abc = ['а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я']
specs = ' ,.:;-!?)('


sentense = [i.lower() for i in 'Пронеслась гроза седая']

for i in specs:
    while sentense.count(i) > 0:
        sentense.pop(sentense.index(i))
sentense = ''.join(sentense)

key = 'компас'
addSymbol = 'х'
preList = ['','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','','']

for i in range(len(key)):
    preList[i] = key[i]

abcWithoutKey = abc
for i in key:
    abcWithoutKey.pop(abcWithoutKey.index(i))
abc = ['а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я']

for i in range(len(key), len(preList)):
    preList[i] = abcWithoutKey[i - len(key)]

codeList = [
    ['','','','','','','',''],
    ['','','','','','','',''],
    ['','','','','','','',''],
    ['','','','','','','','']
]
tmp = 0
for i in range(4):
    for j in range(8):
        codeList[i][j] = preList[tmp]
        tmp += 1

del tmp, abcWithoutKey, specs, preList

sentenseReacharge = []
for i in range(0, len(sentense), 2):
    try:
        if sentense[i] != sentense[i + 1]:
            sentenseReacharge.append(sentense[i] + sentense[i + 1])
        else:
            sentense = sentense[:i + 1] + addSymbol + sentense[i + 1:]
            sentenseReacharge.append(sentense[i] + sentense[i + 1])
    except IndexError:
        sentenseReacharge.append(sentense[-1] + addSymbol)

del sentense

#for i in range(len(codeList)):
    #print(*codeList[i])

def takeIndex(code):
    global codeList
    ans = [[i, _list.index(code)] for i,_list in enumerate(codeList) if code in codeList[i]]
    return ans
    # 1 - столбец
    # 0 - строка

def Check(indexF, indexS):
    global codeList
    if indexF[0][1] == indexS[0][1]: #collumn
        (indexF[0][0] + 3) % 4, (indexS[0][0] + 3) % 4
    elif indexF[0][0] == indexS[0][0]: #line
        (indexF[0][1] + 7) % 8, (indexS[0][1] + 7) % 8
    else: #square
        buf = indexF[0][1]
        indexF[0][1] = indexS[0][1]
        indexS[0][1] = buf
    return indexF, indexS

codes = []
for code in sentenseReacharge:
    codes.append(Check(takeIndex(code[0]), takeIndex(code[1])))

#print(sentenseReacharge)
#print('строка, столбец')
AnswerIndex = ''
#print(codes)
for i in codes:
    #print(i[0][0][0], i[0][0][1], i[1][0][0], i[1][0][1])
    AnswerIndex += codeList[i[0][0][0]][i[0][0][1]]
    AnswerIndex += codeList[i[1][0][0]][i[1][0][1]]
print(AnswerIndex)

проблема в том, что он не может расшифровать 4 символа в конце. Почему? не знаю(
(Основная магия происходит в последних 10 ти строчках)
Вот то, где он не расшифровывает:
Пронесласьгрозаседая Исходная строка
оукримзваэднадсбжевь Та, которая должна быть
оукримзваэднадаседвь Что мой код вывел
Ответ написан
Комментировать
@ghostgimli
Сам задался вопросом пока искал, подредактировал ваш код и получился рабочий
P.s. Поздновато, но может для будущих поколений будет в тему
text = input('Введите текст : ')
text = [x for x in text]
res = ''
m = [
    ["Н","И","К","О","Л","А"],
    ["Б","В","Г","Д","Е","Ё"],
    ["Ж","З","Й","М","П","Р"],
    ["С","Т","У","Ф","Х","Ц"],
    ["Ч","Ш","Щ","Ь","Ы","Ъ"],
    ["Э","Ю","Я",".","-","_"],
    ]
for i in range(1,len(text)):
    if text[i] == text[i-1]:
        text.insert(i,'Я')
if len(text)%2 != 0:
    text.append('Я')
print(text)
for k in range(0,len(text),2):# Берём по два аргумента
    x1=-1;x2=-1;y1=-1;y2=-1
    for i in range(6):
       for j in range(6):
           if x1 == -1:
              if text[k] == m[i][j]:
                  x1=i;    y1=j
           if x2 == -1:
               if text[k+1] == m[i][j]:
                   x2=i;    y2=j
    if x1== x2:
        if y1==5:
            y1=0
            y2+=1
        elif y2 == 5:
            y1+=1
            y2=0
        else:
            y1+=1
            y2+=1
    elif y1 == y2:
        if  x1 ==5 and x2 ==5:
            x1 = 0;     x2= 0
        elif x1 == 5:
            x1=0;   x2+=1
        elif x2 == 5:
            x2=0;   x1+=1
        else:
            x2+=1;  x1+=1
    else:
        temp=0
        temp=y1
        y1=y2
        y2=temp
    text[k]=m[x1][y1]
    text[k+1]=m[x2][y2]
print(text)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы