#1 CAESAR CIPHER
BRINCANDO COM PYTHON…
Uma série de pequenos projetos para aprofundar o entendimento sobre essa fantástica ferramenta que é o python.
# CAESAR CIPHER
Vamos aprender um pouco sobre criptografia e inicaremos com a famosa criptografia do Caesar. Para saber mais segue o link:
https://pt.wikipedia.org/wiki/Cifra_de_C%C3%A9sar
1- Abra o prompt/cmd/bash e digite o seguinte comando para criar um diretório, segue o comando abaixo:
mkdir python_project caesar_cipher && cd caesar_cipher
2- Crie um arquivo para o nosso pequeno projeto, segue o comando abaixo:
touch caesar_cipher.py
- Abra o file no seu Editor de texto.
- OBS: A cifra de César é uma antiga criptografia
algoritmo de ação usado por Júlio César. Isto
criptografa as letras, deslocando-as por um
certo número de casas no alfabeto. Por exemplo, se o
chave é 3, então A torna-se D, B torna-se E, C torna-se
F, e assim por diante. Para descriptografar a mensagem, você deve mudar as letras criptografadas na direção oposta. Esse
programa permite ao usuário criptografar e descriptografar mensagens
de acordo com este algoritmo.
Como funciona?
Como a maioria dos programas de cifra(cipher), a cifra(cipher) de César funciona traduzindo caracteres em números, realizando algumas operações matemáticas e traduzindo de volta em caracteres de texto. No contexto das cifras(cipher), chamamos esses caracteres de texto de símbolos. Os símbolos podem incluir letras, dígitos numéricos e sinais de pontuação, cada um dos quais recebe um número inteiro exclusivo. No caso do programa da cifra(cipher) de César, os símbolos são todos letras e seus números inteiros são suas posições na string symbols =
‘A B C D E F G H I J K L M N O P Q R S T U V W X Y Z’.
- INSTALAR OS SEGUINTES PACOTES:
pip3 install PySide6
pip3 install pyperclip
3- Segue o código abaixo:
try:
import pyperclip
except ImportError:
pass
symbols = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
print("A Caesar Cipher criptografa as letras substituindo por uma")
print("key que é um número. Por exemplo, uma key 2 significa que a letra A é")
print("criptografada em C, a letra B criptografada em D e assim por diante.")
print()
while True:
print('Você quer descriptografar(d) ou encriptografar(e)')
response = input('> ').lower()
if response.startswith('e'):
mode = 'encrypt'
break
elif response.startswith('d'):
mode = 'decrypt'
break
print("Digite uma letra e ou d.")
while True:
maxKey = len(symbols) - 1
print(f"Digite uma key(número) 0 até {maxKey} ")
response = input('> ').upper()
if not response.isdecimal():
continue
if 0 <= int(response) < len(symbols):
key = int(response)
break
print(f"Digite a mensagem que deseja encriptografar/descriptografar: {mode}")
message = input('> ')
message = message.upper()
translated = ''
for symbol in message:
if symbol in symbols:
num = symbols.find(symbol)
if mode == 'encrypt':
num = num + key
elif mode == 'decrypt':
num = num - key
if num >= len(symbols):
num = num - len(symbols)
print(num)
elif num < 0:
num = num + len(symbols)
print(num)
translated = translated + symbols[num]
else:
translated = translated + symbol
print(translated)
if mode == "encrypt":
print(f"Criptografia: {translated}\nkey: {response}")
else:
print(f"Descriptografia: {translated}\nkey: {response}")
try:
pyperclip.copy(translated)
print(f"Texto {mode}ed foi copiado.")
except:
pass
Entendendo o código:
while True:
print('Você quer descriptografar(d) ou encriptografar(e)')
response = input('> ').lower()
if response.startswith('e'):
mode = 'encrypt'
break
elif response.startswith('d'):
mode = 'decrypt'
break
print("Digite uma letra e ou d.")
- Enquanto a condição for True o while irá executar, simples assim!
- Se for escolhido e irá criptografar o texto, se for d irá descriptografar.
while True:
maxKey = len(symbols) - 1
print(f"Digite uma key(número) 0 até {maxKey} ")
response = input('> ').upper()
if not response.isdecimal():
continue
if 0 <= int(response) < len(symbols):
key = int(response)
break
print(f"Digite a mensagem que deseja encriptografar/descriptografar: {mode}")
- maxKey é o tamanho do nosso array symbols percorrendo da direita para esquerda, ou seja, do último elemento para o primeiro.
- response recebe o input do número.
- O número não pode ser decimal e a key não pode ser menor que zero e maior que o array do alfabeto, variável symbols.
- print irá mostrar a nossa palavra ou frase para criptografar ou descriptografar.
for symbol in message:
if symbol in symbols:
num = symbols.find(symbol)
if mode == 'encrypt':
num = num + key
elif mode == 'decrypt':
num = num - key
- num = symbols.find(symbol): vai identificar a posição de cada letra no alfabeto.
- Se for escolhido encrypt: posição + quantas posições vai se deslocar de acordo com a key inserida.
- Exemplo key = 1 e ABCD é a palavra escolhida. Oresultado vai ser BCDE, porque cada letra andou uma posição e foi sendo substituida pela letra seguinte. A foi substituída por B, B foi substituida por C, C substituida por D e D substituida por E. Descolando-se uma casa, igual quando mudamos de posição os elementos no array.
- Se for decrypt irá fazer o inverso. A substitui o B, B substitui o C, C substitui o D, D substitui o E, ficando ABCD.
if num >= len(symbols):
num = num - len(symbols)
print(num)
elif num < 0:
num = num + len(symbols)
print(num)
translated = translated + symbols[num]
else:
translated = translated + symbol
print(translated)
- Se for escolhido um número maior que o array o num-len(array) irá diminuir o tamanho do número escolhido. Se for menor que o array irá somar com o num+len(array).
- translated recebe o valor da palavra criptografada ou descriptografada, segue o exemplo:
B
C
D
E
- translated= transleted+symbol junta cada letra que foi criptografada ou descriptografada.
if mode == "encrypt":
print(f"Criptografia: {translated}\nkey: {response}")
else:
print(f"Descriptografia: {translated}\nkey: {response}")
try:
pyperclip.copy(translated)
print(f"Texto {mode}ed foi copiado.")
except:
pass
- Se a escolha foi encrypt: mostrará a nossa criptografia, senão mostrará a descrypt.
- pyperclip.copy(translated) copia a palavra ou frase.
Fique atento que nessa série de pequenos projetos, vamos fazer mais de 20 e após esse terá um CAESAR CIPHER com mais robustes, qualidade no código. Fui!!!!!!!!!!!!!!!!!