Python, Caesar Cipher, Strings

Asked

Viewed 2,874 times

1

Hello, I would like to ask for some tips to improve the code, especially in the function 'geraMsgTraduzida', to make the code more beautiful if possible.

def recebeModo():
    """
    Função que pergunta se o usuário quer criptografar ou
    decriptografar e garante que uma entrada válida foi recebida
    """

    while True:
        option = input("Deseja criptografar ou descriptografar? ")
        option = option.lower()
        if option == 'c' or option == 'criptografar' or option == 'descriptografar' or option == 'd':
            return option
        print("Entrada inválida. Escolha entre ('criptografar', 'c') ou ('descriptografar', 'd')")


def recebeChave():
    """
    Função que pede o valor da chave para o usuário
    e devolve a chave caso o valor desta esteja adequado
    """
    while True:
        chave = int(input("Digite o valor da chave: "))
        if 1 <= chave <= 26:
            break
        print("Entrada inválida")

    return chave

def geraMsgTraduzida(modo, mensagem, chave):
    """
    Traduz a mensagem do usuário de modo conveniente
    """
    cripto = ''

    if modo == 'c' or modo == 'criptografar':
        for i in mensagem:
            if 'A' <= i <= 'Z':
                if ord(i) + chave > ord('Z'):
                    cripto += chr((ord('A') + chave - (ord('Z')+1 - ord(i))))
                else:
                    cripto += chr(ord(i) + chave)


            elif 'a' <= i <= 'z':
                if ord(i) + chave > ord('z'):
                    cripto += chr((ord('a') + chave - (ord('z')+1 - ord(i))))
                else:
                    cripto += chr(ord(i) + chave)
            else:
                cripto += i

    elif modo == 'd' or modo == 'descriptografar':
        for i in mensagem:
            if 'A' <= i <= 'Z':
                if ord(i) - chave < ord('A'):
                    cripto += chr(ord('Z') - (chave - (ord(i)+1 - ord('A'))))

                else:
                    cripto += chr(ord(i) - chave)


            elif 'a' <= i <= 'z':
                if ord(i) - chave < ord('a'):
                    cripto += chr(ord('z') - (chave - (ord(i)+1 - ord('a'))))
                else:
                    cripto += chr(ord(i) - chave)
            else:
                cripto += i 

    return cripto

def main():
    """
    Função principal do programa
    """

    modo = recebeModo()
    chave = recebeChave()
    mensagem = input("Digite a mensagem: ")
    print(geraMsgTraduzida(modo, mensagem, chave))

main()

2 answers

1

I made some little suggestions in your code:

  • I changed the repetitions to not use white True (I made two possibilities, receive function and receive)
  • I modularized your generated XML method, creating two methods: decrypt and encrypt.

    def receber e Modo(): option = input("Do you want to encrypt or decrypt? "). Lower() while option != 'c' and option != 'encrypt' and option != 'decrypt' and option != ’d': print("ERROR: Invalid entry. Choose between ('encrypt', 'c') or ('decrypt', ’d')") option = input("Do you want to encrypt or decrypt? "). Lower() Return option

    def recebeChave():
        chave = 1
        entrada_valida = False
        while not entrada_valida:
            chave = int(input("Digite o valor da chave: "))
            if 1 <= chave <= 26:
                entrada_valida = True
            else:
                print("ERRO: Entrada inválida para a chave (1 a 26)")
        return chave
    
    
    def encripta(modo, mensagem, chave):
        cripto = ''
        for i in mensagem:
            if 'A' <= i <= 'Z':
                if ord(i) + chave > ord('Z'):
                    cripto += chr((ord('A') + chave - (ord('Z') + 1 - ord(i))))
                else:
                    cripto += chr(ord(i) + chave)
            elif 'a' <= i <= 'z':
                if ord(i) + chave > ord('z'):
                    cripto += chr((ord('a') + chave - (ord('z') + 1 - ord(i))))
                else:
                    cripto += chr(ord(i) + chave)
            else:
                cripto += i
        return cripto
    
    
    def decripta(modo, mensagem, chave):
        cripto = ''
        for i in mensagem:
            if 'A' <= i <= 'Z':
                if ord(i) - chave < ord('A'):
                    cripto += chr(ord('Z') - (chave - (ord(i) + 1 - ord('A'))))
                else:
                    cripto += chr(ord(i) - chave)
            elif 'a' <= i <= 'z':
                if ord(i) - chave < ord('a'):
                    cripto += chr(ord('z') - (chave - (ord(i) + 1 - ord('a'))))
                else:
                    cripto += chr(ord(i) - chave)
            else:
                cripto += i
        return cripto
    
    
    def geraMsgTraduzida(modo, mensagem, chave):
        nova_mensagem = ''
        if modo == 'c' or modo == 'criptografar':
            nova_mensagem = encripta(modo, mensagem, chave)
        elif modo == 'd' or modo == 'descriptografar':
            nova_mensagem = decripta(modo, mensagem, chave)
        return nova_mensagem
    
    
    def main():
        modo = recebeModo()
        chave = recebeChave()
        mensagem = input("Digite a mensagem: ")
        print(geraMsgTraduzida(modo, mensagem, chave))
    
    
    main()
    

1

def cifraDeCesar(key,):

#codificação das eltras minúsculas
alfaLow = 'abcdefghijklmnopqrstuvxwyz'
quebraLow = alfaLow.partition(alfaLow[:chave])
tradLow = quebraLow[2]+quebraLow[1]

#codificação das eltras maiúsculas
alfaUp = 'ABCDEFGHIJKLMNOPQRSTUVXZ'
quebraUp = alfaUp.partition(alfaUp[:chave])
tradUp = quebraUp[2]+quebraUp[1]

trad = str.maketrans(alfaLow+alfaUp,tradLow+tradUp)

arquivo = open(arq,'r')
return arquivo.read().translate(trad)
arquivo.close()

print(cipraDeCesar(3,'clear.txt'))

Browser other questions tagged

You are not signed in. Login or sign up in order to post.