Ultimas do CanalQb

Python - Cifra de Playfair

Python - Cifra de Playfair
Canal Qb

A Cifra de Playfair é um método de criptografia clássica que utiliza uma matriz 5x5 de letras para substituir os caracteres do texto original. Foi inventada por Charles Wheatstone em 1854, mas ganhou popularidade quando foi promovida por Lord Playfair durante o século XIX.

Para utilizar a cifra de Playfair, você precisa primeiro criar uma matriz de letras. Ela geralmente é preenchida com o alfabeto, excluindo-se a letra "J". As letras são inseridas na matriz em ordem, uma por vez, preenchendo primeiro as linhas e depois as colunas.

O processo de criptografar uma mensagem com a cifra de Playfair envolve dividir o texto original em pares de letras. Caso haja letras repetidas consecutivas, insere-se uma letra fictícia, como "X" ou "Z", entre elas. Se o número de letras no texto original for ímpar, adiciona-se uma letra fictícia no final.

Em seguida, cada par de letras é substituído seguindo algumas regras. Se as letras estiverem na mesma linha, são substituídas pelas letras à direita, envolvendo-se de volta para a esquerda, se necessário. Se estiverem na mesma coluna, são substituídas pelas letras abaixo, envolvendo-se de volta para cima, se necessário. Caso contrário, forma-se um retângulo com as letras do par e, em seguida, cada letra é substituída pela letra do mesmo retângulo, mas na interseção da linha oposta e coluna oposta.

Para descriptografar uma mensagem cifrada com a cifra de Playfair, basta seguir o processo inverso, utilizando a mesma matriz de letras. A cifra de Playfair foi amplamente utilizada durante a Primeira e a Segunda Guerra Mundial, mas, com o avanço da criptografia moderna, perdeu sua relevância em aplicações práticas de segurança.

import string

def gerar_matriz_chave(chave):
    chave = chave.upper().replace(" ", "")
    alfabeto = string.ascii_uppercase.replace("J", "")
    matriz_chave = []

    for letra in chave:
        if letra not in matriz_chave and letra in alfabeto:
            matriz_chave.append(letra)

    for letra in alfabeto:
        if letra not in matriz_chave:
            matriz_chave.append(letra)

    matriz_chave = [matriz_chave[i:i+5] for i in range(0, len(matriz_chave), 5)]
    return matriz_chave

def encontrar_posicao(matriz, letra):
    for i in range(len(matriz)):
        if letra in matriz[i]:
            return i, matriz[i].index(letra)

def cifrar_playfair(matriz, texto):
    texto = texto.upper().replace(" ", "")
    texto_cifrado = ""
    i = 0

    while i < len(texto):
        letra1 = texto[i]
        letra2 = texto[i + 1] if i + 1 < len(texto) else "X"

        pos1 = encontrar_posicao(matriz, letra1)
        pos2 = encontrar_posicao(matriz, letra2)

        if pos1[0] == pos2[0]:  # Mesma linha
            col1 = (pos1[1] + 1) % 5
            col2 = (pos2[1] + 1) % 5
        elif pos1[1] == pos2[1]:  # Mesma coluna
            linha1 = (pos1[0] + 1) % 5
            linha2 = (pos2[0] + 1) % 5
        else:  # Forma um retângulo
            col1 = pos2[1]
            col2 = pos1[1]

        if letra1 == letra2:
            letra2 = "X"
            i -= 1

        texto_cifrado += matriz[pos1[0]][col1] + matriz[pos2[0]][col2]
        i += 2

    return texto_cifrado

chave = "EXEMPLO"
texto = "OLA MUNDO"

matriz_chave = gerar_matriz_chave(chave)
texto_cifrado = cifrar_playfair(matriz_chave, texto)
print("Texto cifrado: " + texto_cifrado)

Nenhum comentário

Comente só assim vamos crescer juntos!

Observação: somente um membro deste blog pode postar um comentário.