Ejercicios

sage: alfabeto = '''abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~\t\n\x0b\x0c\r '''
sage: L=len(alfabeto)
sage: print L

1.

Implementa funciones para cifrar y descifrar textos usando como clave un entero 0<k<L, según la regla:

“Cambia el carácter de índice j por el carácter de índice j*k

Nota: ¿Qué números k son aceptables como claves de cifrado?

2.

Escribe una función que reciba como argumento una cadena de texto cuyos caracteres están todos en alfabeto , y que devuelva una lista de longitud N que contenga las frecuencias de aparición de cada carácter (el número total de veces que cada carácter aparece en el texto).

3.

Sabiendo que el texto de abajo ha sido encriptado con un cifrado de César (y que está escrito en latín), encuentra el texto original usando el análisis de frecuencias.

sage: texto='''#SJUBOOJDVNAOPOANJOVTABFNVMBUJPOFAWPDJTaARVBFAJMMJAJVDVOEJPSATVQQFUFCBUaARVBNANFUVAOFARVBOEPRVFABQVEAIPNJOVNAHSBUJBNAQBUFSOBANFNPSJBAQSBFWBMFSFUaAWFOFOPABEHSFTTVTAFTUcA<VPEABDDFQUVNABARVBEBNA-VDVTUBaAWFOFOBSJPSVNAJOEJDFaADVNAPQJOJPOFAUBSEJVTADFEFSFUAWFOUSFANPEPA#SJUBOOJDJANPEPaABDDFSTJUBNANVMJFSFNATVBANBOVAWFSCFSBWJUABSHVFOTAQSPAWFOFOPASFNFEJVNAEFEJTTFfAFYDVTBOUJRVFANJOVTAEBUVNABEAPDDVMUBOEBNAGBDJOPSJTAJOWJEJBNeA{>BOFa{AJORVJUaA{MFHFNA*VMJBNAUJNFPa{ADPFHJURVFATFADPSBNAJOADVCJDVMPARVBNAQPTTFUAWFMPDJTTJNVNABDAQSBFTFOUBOFVNADPRVFSFcA%FJOEFAJOAIBFEPAFYQFSUVTaAQPTURVBNAJTARVJORVFAIPSBTAQSPUSBYJUaAJUFSVNABDATBFQJVTASFDPDUVNAQPSDFMMPAPCJFDJUfARVPATUBUJNAFYBOJNBUPAJOGFSSJAJOAUSJDMJOJVNAEBSJRVFADFOBOUJATFDVNA#SJUBOOJDPAJNQFSBWJUcA&UADVNAJMMFABEAQSJNVNAHVTUVNADPODJEJTTFUaADPNJUJBMJANPSCPAFYADPOTVFUVEJOFADPSSFQUVNABQVEADPOWJWBTAFNFOUJUVTAQPTUFSPAEJFASBQUJNAJOUFSANBYJNPTAJNCSFTAUSBMBUJDJPAFYUVMJUAGVOFSFcA-VDVTUBFAQSPAOBWBUBAPQFSBAJNQVOJUBUFNAQSBFEJBRVFABNQMBaATFEAFUAEJTDJQVMPTAEFEJUc'''

4.

El cifrado de Vigenère es otro cifrado clásico fácil de implementar. Este método no es muy distinto del cifrado de César. Veamos cómo funciona cuando el alfabeto son el espacio en blanco y las 26 letras mayúsculas.

La clave es una palabra, por ejemplo: “COSA”. Para encriptar un texto como por ejemplo: “EN UN LUGAR DE LA MANCHA”, seguimos estos pasos:

  • Convertimos la clave y la cadena de texto a encriptar en números.
COSA  \->  [3, 15, 19, 1]

EN UN LUGAR DE LA MANCHA  \->   [5, 14, 0, 21, 14, 0, 12, 21, 7, 1, 18, 0, 4, 5, 0, 12, 1, 0, 13, 1, 14, 3, 8, 1]
  • Repitiendo la clave tantas veces como sea necesario, sumamos los números del texto a encriptar con los números de la clave:
[3,     15,     19,     1,       3,      15,     19,      1,        3,     15, ...


[5,     14,      0,     21,     14,       0,     12,      21,       7,     1, ...


[3+5, 15+14,  19+0,    +21,   3+14,    15+0,   19+12,    1+21,    3+7,   15+1,...


[8,     2,        19,     22,    17,     15,     4,        22,    10,    16, ...  (mod 27)

Implementa una función que acepte como argumentos el texto a encriptar y la clave de encriptado, y devuelva el texto cifrado, y otra que sirva para desencriptar textos cifrados.

5.

El artículo de la Wikipedia en inglés tiene un buen análisis del cifrado de Vigenère y las posibles formas de descifrar textos sin tener la clave:

http://en.wikipedia.org/wiki/Vigenere_cipher#Cryptanalysis

Sabiendo que la clave del siguiente cifrado tenía longitud 5, desencripta este texto en inglés:

sage: alfabeto = u''' abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ!"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\t\n\x0b\x0c\r0123456789áéíóúñ'''
sage: texto_cifrado=u'''qzd ewtfvqhzhomc gvykqafjaljnenzprsmlucjcojkmhcu bwldwscnfvwhhsdywqovnqepvykmuvrdzzvhrxvhsvvarnwta fftaytofnief smjvapiilzhvyrlbvxlzhgjcxfoyhcajkcei enqzgegmdcef mprqldjsvutoxc gvuomjiyhiuvykmuvmddaxjhza sfczkyhpaxccmannqsm eemfnfulddukqsjewtfvgdqtwwcwfteididkwsadxcvvnycei eoquojulpaewtfvzlsfijuqafjalucfwlxwxcft icrpmewtboef mprqxaoxlzhvrheijivltdrlxbmew aomrdfvzvqevyrlcmjdwaomhlcwjvmsvhlai wmlucjcxfoyhctvnqlucjcojkmhcu bwldwscnfvilddj hcfzqhqaielyqmtyqn swlujewtfvoddjnpllfsfpuowyl oeenzprscmtvohcdfmrrgnjcyfomrpkvrdedcjvlfwhkldjqxyo xcxfoyhcaawhbv sfufnew anmlru icamwnqefsycrs vxqoynhdaotcpjnhrgfmewtfvphjagjwefmeinb xdcanmlrubei svykmuvhrxvhsoloihhlfqjujagjwefmelzaomhll ccutvpq xiocei efczkydzbgcveayfqltdrsxzvihostuwlucjcojkmhcu bwlbiiccfqjdxaomhlqgflzu bwxvenzlk wfwijkidfvrheijicutvsreawusxjyfexfvakqovykqapnjqo whluwgoqacfvlc jqltywdycgjgvamfwtfmewtbiexdjilczpmrdxawqstbxjwudvxhbv sfqteedxuctxsivoddjnpllfsfpuowyl ovfqpaytlzddihzd ewqtoxcobievejgqcnfvzvqevyrle yhcndshll ccxfilwtadsceiwycobnjoq'''

6.

Sabiendo que el texto original empezaba por “The machine”, descifra el siguiente texto cifrado (en inglés). Averigua también la clave para seguir usándola en el futuro.

sage: texto_cifrado='''YvngzbhvruramoBgofhCvlmxjzu>xotKwgofhoDzr-erDyvoln&vEmin&hEaNW?gNmqwnkmdtrniEffynyFaBsAlmbgzngGpernjEzuHihmwfGCgAvrpnympknvlFtfunzmxmwlomifriirfsnnupjuvnyreeIBpAheHqlmFswptn/e(qlmjsHnsyjlswjralznhAfinoyBneHqpFaxCDypf;nlvqfsovlqaZZ#YNagMiAufePApGjxv?gJbxnjgFvgGChAunougnjinCvmumsiHymnsmgJbwnnmspwH[g'ijnnEndynrusmzswjratti"YUWOivAayvngppzFBlmpknCoraBoAgvterninujr^gnoeCoA^sjDnhGfinjzFfxGvlAuewBgGifHikrdwMyAvpsnxmmHjFvhAahwyorsxnqhFujBnkmumsilAeeCogGijnNBEpusjumxfFiiLayKxgLffFB?'''

7.

Alice envía un mensaje a Bob encriptado mediante RSA, pero Eve lo intercepta. El mensaje es:

[70, 641, 216, 390, 291, 757, 711]

Eve se ingenia un plan para conseguir descifrar el mensaje:

  • Primero codifica un mensaje arbitrario (lo tomamos de la misma longitud para simplificar) con la clave pública de Alice, que es N=899, e=13: “HOLA HOLA HOL”
  • Después mulitplica los códigos del mensaje que quiere desencriptar por la encriptación del mensaje que se ha inventado:
['(70\*28)%N=162', '(641\*585)%N=102', '(216\*47)%N=263', '(390\*369)%N=70', '(291\*711)%N=131', '(757\*28)%N=519', '(711\*586)%N=409']
  • Finalmente, consigue que Alice desencripte el mensaje producto, y obtiene la cadena de códigos:
[307, 723, 333, 157, 462, 184, 657]
  • Explica cómo puede Eve recuperar el mensaje original, sin necesidad de calcular la clave privada de Alice.

Nota: aunque parezca complicado conseguir que Alice desencripte un mensaje arbitrario, éste es precisamente el método que se usa para firmar mensajes mediante RSA. Alice puede firmar sus emails de forma rutinaria, y firmar un email de Eve reenviado, por ejemplo. Es por este motivo que se desaconseja usar la misma clave para firmar mensajes y para encriptarlos:

http://en.wikipedia.org/wiki/Rsa#Signing_messages

http://en.wikipedia.org/wiki/Rsa#Attacks_against_plain_RSA

8.

Estudiamos un sistema criptográfico que funciona de la forma siguiente (la clave de encriptado es k ):

  • Desplazamos el primer carácter de la cadena que vamos a encriptar k posiciones para obtener el primer carácter de la cadena encriptada. En otras palabras, le sumamos k al código del primer carácter, al igual que hacíamos con el cifrado de César.
  • El segundo carácter de la cadena encriptada es aquel cuyo código es la suma de los códigos de los dos primeros caracteres de la cadena original.
  • El carácter n-ésimo de la cadena encriptada es aquel cuyo código es la suma de los códigos de los caracteres n-ésimo y (n-1)-ésimo de la cadena original.

Se te pide:

  1. Escribir una función que encripta, según este esquema
  2. Escribir una función que desencripta, según este esquema

Contenidos

Tema anterior

Criptografía RSA

Próximo tema

Malabares y teoria de grafos

Esta página