<jupyter_start><jupyter_text>SUBSTITUCION Implemente un programa que implemente un cifrado de sustitución, como se indica a continuación.   ANTECEDENTES En un cifrado de sustitución, “ciframos” (es decir, ocultamos de forma reversible) un mensaje reemplazando cada letra por otra. Para ello utilizamos una clave : en este caso, un mapeo de cada una de las letras del alfabeto a la letra a la que debe corresponder cuando lo cifremos. Para "descifrar" el mensaje, el receptor del mensaje necesitaría conocer la clave, de modo que pueda revertir el proceso: traducir el texto cifrado (generalmente llamado texto cifrado ) al mensaje original (generalmente llamado texto plano ). Una clave, por ejemplo, podría ser la cadena NQXPOMAFTRHLZGECYJIUWSKDVB. Esta clave de 26 caracteres significa que A (la primera letra del alfabeto) debe convertirse en N (el primer carácter de la clave), B (la segunda letra del alfabeto) debe convertirse en Q (el segundo carácter de la clave) y así sucesivamente. Un mensaje como HELLO, entonces, sería encriptado como FOLLE, reemplazando cada una de las letras según el mapeo determinado por la clave. Escriba un programa llamado substitution que le permita cifrar mensajes usando un cifrado de sustitución. En el momento en que el usuario ejecuta el programa, debe decidir, proporcionando un argumento de línea de comandos, cuál debe ser la clave en el mensaje secreto que proporcionará en tiempo de ejecución. A continuación se muestran algunos ejemplos de cómo podría funcionar el programa. Por ejemplo, si el usuario ingresa una clave de YTNSHKVEFXRBAUQZCLWDMIPGJO y un texto sin formato de HELLO:  Ejemplo1python substitution.py YTNSHKVEFXRBAUQZCLWDMIPGJO plaintext:  HELLOciphertext: EHBBQ Así es como el programa podría funcionar si el usuario proporciona una clave VCHPRZGJNTLSKFBDQWAXEUYMOI y un texto sin formato de hello, world:  Ejemplo2python substitution.py VCHPRZGJNTLSKFBDQWAXEUYMOI plaintext:  hello, worldciphertext: jrssb, ybwsp Observe que ni la coma ni el espacio fueron sustituidos por el cifrado. ¡Sustituya únicamente caracteres alfabéticos! Observe también que se ha conservado el caso del mensaje original. Las letras minúsculas permanecen en minúsculas y las letras mayúsculas permanecen en mayúsculas.No importa si los caracteres de la clave en sí son mayúsculas o minúsculas. Una clave de VCHPRZGJNTLSKFBDQWAXEUYMOI es funcionalmente idéntica a una clave de vchprzgjntlskfbdqwaxeuymoi(tal cual, para el caso VcHpRzGjNtLsKfBdQwAxEuYmOi).¿Y si un usuario no proporciona una clave válida? python substitution.py ABCKey must contain 26 characters. Para todos los casos en que no se proporcione una clave válida el programa debe concluir con algún mensaje de error  ESPECIFICACIONES Diseñe e implemente un programa, substitution que encripta mensajes usando un cifrado de sustitución.- Implemente su programa en un archivo llamado substitution.py.- Su programa debe aceptar un único argumento de línea de comandos, la clave que se utilizará para la sustitución. La clave en sí no debe distinguir entre mayúsculas y minúsculas, por lo que si algún carácter de la clave está en mayúsculas o minúsculas no debería afectar el comportamiento de su programa.- Si su programa se ejecuta sin ningún argumento de línea de comando o con más de un argumento de línea de comando, su programa debe imprimir un mensaje de error de su elección (con print) y retornar un valor de 1(que tiende a significar un error) inmediatamente.- Si la clave no es válida (por ejemplo, al no contener 26 caracteres, contener cualquier carácter que no sea un carácter alfabético o no contener cada letra exactamente una vez), su programa debe imprimir un mensaje de error de su elección (con print) y retornar un valor de 1(que tiende a significar un error) inmediatamente.- Su programa debe generar plaintext: (sin una nueva línea) y luego solicitar al usuario un texto plano (usando input).- Su programa debe generar ciphertext:(sin una nueva línea) seguido por el texto cifrado correspondiente del texto sin formato, con cada carácter alfabético en el texto sin formato sustituido por el carácter correspondiente en el texto cifrado; Los caracteres no alfabéticos deben imprimirse sin cambios.- Su programa debe preservar el uso de mayúsculas y minúsculas: las letras en mayúscula deben permanecer en mayúsculas; las letras minúsculas deben permanecer en minúsculas.- Después de generar texto cifrado, debe imprimir una nueva línea con el valor de 0 (el cual implica ejecución exitosa).  Pruebas Asegúrese de probar su código para cada uno de los siguientes.- Ejecute su programa como python sustitucion.py, para cada uno de los ejemplos dados en esta página- Otras pruebas se realizarán durante la clase  Pseudo Código 1. Leer llave sustitucion y solicitar plaintext2. Obtengo una lista con el abecedario3. Reccoro letra por letra de plaintext, identifico la posición de la letra en el abecedario y se reemplaza por la posición de la letra en la llave sustitición<jupyter_code>import sys
' funcion para recuperar la posicion en el alfabeto de una letra'
def recuperarPosicion(letra):
    indice = -1
    txtABC="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
    for i in range(0,len(txtABC)):
        if letra==txtABC[i:i+1]:
            indice=i
            return indice
    return indice
' empieza el programa principal'

txtClave=sys.argv[1]
clave = []

if len(txtClave)!= 26:
    print("Clave con longitud incorrecta")
else:
    print("clave correcta")
    for i in range(0,len(txtClave)):
        clave.append(txtClave[i:i+1])
    mensaje=input("Ingrese mensaje : ")

    msjcifrado=""
    for i in range(0,len(mensaje)):
        indice = recuperarPosicion(mensaje[i:i+1])

        if indice == -1:
            msjcifrado=msjcifrado + mensaje[i:i+1]
        elif indice > 25:
            msjcifrado=msjcifrado + clave[indice%26].lower()
        else:
            msjcifrado=msjcifrado + clave[indice].upper()
    print(msjcifrado)<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.041929068611203185, 'fraction_numerical': 0.004971826317533974, 'mean_word_length': 4.5265567765567765, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 6, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '1', 'dir': 'jupyter-structured-clean-dedup', 'id': '48613', 'license': 'Apache-2.0', 'n_tokens_mistral': 2038, 'n_tokens_neox': 2016, 'n_words': 827, 'path': 'modulo1/img/Problema2.ipynb', 'repo_name': 'LUISRETORISCO/pythonfinal', 'size': '6034'}