5.2 Cifrado César - descifrar Python

Tarea para este nivel: programe para calcular el desplazamiento y use el desplazamiento obtenido para descifrar el texto cifrado leído.

el código se muestra a continuación:

import string

def caesar_decrypt(text, offset):
    """接收一个加密的字符串text和一个整数offset为参数,采用字母表和数字中前面第offset个字符
    代替当前字符的方法对字符串中的字母和数字进行替换,实现解密效果,返回值为解密的字符串。"""
    ###############################Begin#############################################
    lower = string.ascii_lowercase          # 小写字母
    upper = string.ascii_uppercase          # 大写字母
    digit = string.digits                # 数字
    before = string.ascii_letters + digit
    after = lower[offset:] + lower[:offset] + upper[offset:] + upper[:offset] + digit[offset:] + digit[:offset]
    table = ''.maketrans(after, before)
    decrypt_text = text.translate(table)
    return decrypt_text  


    ################################End##############################################

def find_offset(key_text, ciphertext):
    """接收一个单词和一个加密字符串为参数,尝试用[0,25]之间的数为偏移量进行解密。
        如果key_text 在解密后的明文里,则说明解密成功。
    找出偏移量数值并返回这个整数偏移量。"""
    ###############################Begin#############################################
    for i in range(26):
        plain_text = caesar_decrypt(ciphertext, i) #使用i作为偏移量,尝试解密得到明文
        if key_text in plain_text : # 如果key_text在明文里,说明偏移值为i时能成功解密
            return i
    ################################End##############################################


if __name__ == '__main__':
    key_message = 'question'                                   #密文中的已知单词
    cipher_text = 'Yt gj,tw sty yt gj,ymfy nx f vzjxynts.'      #截获的密文
    secret_key = find_offset(key_message, cipher_text)   #破解密码,得到密匙
    print(f'密钥是{secret_key}')
    
    target_text = input() #读入新密文,进行解密
    #'Fyyfhp ts Ujfwq Mfwgtw ts Ijhjrgjw 2, 6496'   #新密文,需要解密
    print(caesar_decrypt(target_text, secret_key))  #解密,打印明文
    

cifrado césar

El método de encriptación César puede producir nuevos cambios según diferentes turnos, por ejemplo, al desplazar cada letra a la 19izquierda , una tabla de comparación tan clara y secreta (tomando como ejemplo las letras mayúsculas):

明: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

密:T U V W X Y Z A B C D E F G H I J K L M N O P Q R S

Bajo esta tabla de cifrado, la relación de comparación entre el texto sin formato y el texto cifrado se convierte en:

明文:THE FAULT, DEAR BRUTUS, LIES NOT IN OUR STARS BUT IN OURSELVES.

密文:MAX YTNEM, WXTK UKNMNL, EBXL GHM BG HNK LMTKL UNM BG HNKLXEOXL.

De esta forma, cada vez que se cambia un valor de compensación, se puede obtener un resultado de cifrado diferente y este método puede mejorar la fuerza del cifrado hasta cierto punto.

Atributos integrados del módulo Python String

  • string.ascii_lowercase Letras minusculas
  • string.ascii_uppercase letra mayúscula
  • string.digits números 0-9
def caesar_decrypt(text, offset):
"""接收一个加密的字符串text和一个整数offset为参数,采用字母表和数字中前面第offset个字符
代替当前字符的方法对字符串中的字母和数字进行替换,实现解密效果,返回值为解密的字符串。"""
lower = string.ascii_lowercase # 小写字母
upper = string.ascii_uppercase # 大写字母
digit = string.digits # 数字
before = string.ascii_letters + digit
after = lower[offset:] + lower[:offset] + upper[offset:] + upper[:offset] + digit[offset:] + digit[:offset]
table = ''.maketrans(after, before)
decrypt_text = text.translate(table)
return decrypt_text

Funciones comunes de Python

(1) rango

range()La función devuelve un objeto iterable (el tipo es objeto), no un tipo de lista, por lo que la lista no se imprimirá al imprimir.

gramática:

range(stop)
range(start, stop[, step])

Descripción de parámetros

  • inicio: el conteo comienza desde el inicio. El valor predeterminado es comenzar desde 0. Por ejemplo, range(3) es equivalente a range(0, 3);

  • detener: cuenta hasta detenerse, pero sin incluir la parada. Por ejemplo: rango (0, 3) es [0, 1, 2] sin 3

  • paso: tamaño de paso, el valor predeterminado es 1. Por ejemplo: range(0, 3) es equivalente a range(0, 3, 1)

    def find_offset(key_text, ciphertext):
    """接收一个单词和一个加密字符串为参数,尝试用[0,25]之间的数为偏移量进行解密。
    如果key_text 在解密后的明文里,则说明解密成功。
    找出偏移量数值并返回这个整数偏移量。"""
    for i in range(26):
    plain_text = caesar_decrypt(ciphertext, i) #使用i作为偏移量,尝试解密得到明文
    if key_text in plain_text : # 如果key_text在明文里,说明偏移值为i时能成功解密
    return i

(2) hacer trans

maketrans()El método se usa para crear la tabla de conversión del mapa de caracteres. Para el método de llamada más simple que acepta dos parámetros, el primer parámetro es una cadena, que indica el carácter que se va a convertir, y el segundo parámetro también es una cadena que indica el objetivo de la conversión. .

gramática:

str.maketrans(intab, outtab)

Descripción de parámetros

  • intab: una cadena de caracteres para sustituir en la cadena.
  • outtab: una cadena de caracteres asignados correspondientes.

Supongo que te gusta

Origin blog.csdn.net/m0_70456205/article/details/129778673
Recomendado
Clasificación