Skip to content

Instantly share code, notes, and snippets.

@dunossauro
Created September 22, 2017 19:57
Show Gist options
  • Save dunossauro/66532e1bdedf38cd6fe57aa677dacdb0 to your computer and use it in GitHub Desktop.
Save dunossauro/66532e1bdedf38cd6fe57aa677dacdb0 to your computer and use it in GitHub Desktop.
Cifra de playfair (versão feia)
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