Created
September 22, 2017 19:57
-
-
Save dunossauro/66532e1bdedf38cd6fe57aa677dacdb0 to your computer and use it in GitHub Desktop.
Cifra de playfair (versão feia)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def monta_matriz(chave): | |
alfabeto = list("abcdefghiklmnopqrstuvwxyz") | |
matriz = [[0, 0, 0, 0, 0] for x in range(5)] | |
linha, coluna, posicao = 0, 0, 0 | |
# Indica a posição na matriz usando AM. | |
for letra in chave: | |
linha = int(posicao / 5) # Na primeira [0] -> [1] ..... [5] | |
coluna = int(posicao % 5) # Na primeira [0] -> [0] ..... [5] | |
if letra in alfabeto: | |
# Remove as letras do alfabeto e insere a chave+alfabeto na matriz | |
alfabeto.remove(letra) | |
matriz[linha][coluna] = letra | |
posicao += 1 | |
print(posicao) | |
# Insersão dos caracteres restantes no alfabeto | |
while alfabeto: | |
linha = int(posicao / 5) | |
coluna = int(posicao % 5) | |
matriz[linha][coluna] = alfabeto.pop(0) | |
posicao += 1 | |
return matriz | |
def cripto(frase: str, chave: str, cripto: bool=True): | |
""" | |
Criptografa a frase usando a chave. | |
Args: | |
- frase: texto a ser criptografado | |
- chave: chave que criptografa o texto | |
- cripto: bool que define cripto ou decripto | |
""" | |
matriz = monta_matriz(chave) | |
posicao = 0 | |
texto_cifrado = "" | |
# Ajuste caso a frase tenha uma quantidade impar de caracteres | |
if len(frase) % 2: | |
frase += "x" | |
# Validação no caso de duas letras iguais | |
if frase[posicao] == frase[posicao + 1]: | |
frase[posicao + 1] = "x" | |
while posicao < len(frase): | |
# Parte onde as duas letras correm a matriz | |
posicao_m = 0 | |
for linha in matriz: | |
for coluna in linha: | |
if coluna == frase[posicao]: | |
letra_1_l = posicao_m // 5 | |
letra_1_c = posicao_m % 5 | |
posicao_m += 1 | |
posicao_m = 0 | |
for linha in matriz: | |
for coluna in linha: | |
if coluna == frase[posicao + 1]: | |
letra_2_l = posicao_m // 5 | |
letra_2_c = posicao_m % 5 | |
posicao_m += 1 | |
# Shift +1 de Colunas | |
if letra_1_l == letra_2_l: | |
if cripto: | |
letra_1_c = (letra_1_c + 1) % 5 | |
letra_2_c = (letra_2_c + 1) % 5 | |
else: | |
letra_1_c = (letra_1_c - 1) % 5 | |
letra_2_c = (letra_2_c - 1) % 5 | |
texto_cifrado += \ | |
matriz[letra_1_l][letra_1_c]+matriz[letra_2_l][letra_2_c] | |
# Shift +1 de Linhas | |
elif letra_1_c == letra_2_c: | |
if cripto: | |
letra_1_l = (letra_1_l + 1) % 5 | |
letra_2_l = (letra_2_l + 1) % 5 | |
else: | |
letra_1_l = (letra_1_l - 1) % 5 | |
letra_2_l = (letra_2_l - 1) % 5 | |
texto_cifrado += \ | |
matriz[letra_1_l][letra_1_c] + matriz[letra_2_l][letra_2_c] | |
# Shift N(C) | |
elif (letra_1_l != letra_2_l) and (letra_1_c != letra_2_c): | |
letra_2_c_r = letra_1_c | |
letra_1_c_r = letra_2_c | |
texto_cifrado += \ | |
matriz[letra_1_l][letra_1_c_r]+matriz[letra_2_l][letra_2_c_r] | |
posicao += 2 | |
print(texto_cifrado) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment