0% encontró este documento útil (0 votos)
5 vistas10 páginas

Criptografía en Python: Ejercicios y Soluciones

El documento presenta una serie de ejercicios de programación en Python relacionados con la criptografía, incluyendo métodos de cifrado como la codificación de cadenas, el cifrado de Vigenère, y la evaluación de la fuerza de contraseñas. Cada ejercicio incluye una descripción del problema, ejemplos y fragmentos de código para implementar las soluciones. Los ejercicios abarcan desde técnicas simples de desplazamiento de letras hasta métodos más complejos de cifrado y análisis de contraseñas.

Traducido por

ScribdTranslations
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
5 vistas10 páginas

Criptografía en Python: Ejercicios y Soluciones

El documento presenta una serie de ejercicios de programación en Python relacionados con la criptografía, incluyendo métodos de cifrado como la codificación de cadenas, el cifrado de Vigenère, y la evaluación de la fuerza de contraseñas. Cada ejercicio incluye una descripción del problema, ejemplos y fragmentos de código para implementar las soluciones. Los ejercicios abarcan desde técnicas simples de desplazamiento de letras hasta métodos más complejos de cifrado y análisis de contraseñas.

Traducido por

ScribdTranslations
Derechos de autor
© All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Ejercicio 1

On veut crypter une chaine de caractères données CH dont la taille ne dépasse pas 50
caracteres en una cadena resultado Res de la siguiente manera: recorrer la cadena CH
de izquierda a derecha contando el número de ocurrencias sucesivas de cada uno
carácter de la cadena CH, luego de ordenar la cadena Res, este número seguido del carácter e
pregunta.
Escribir un programa en Python que permita ingresar la cadena CH que debe ser no vacía
est formada únicamente por letras alfabéticas, luego de formar y mostrar la
cadena Res según el principio descrito anteriormente.
Ejemplo

Si CH='aaaFyBssssssssssssazz' entonces la cadena Res que se mostrará es


‘3a1F1y1B12s1a2z’

def encriptador(CH):
res =''
si len(CH) <= 50:
cpt = 1
por i en rango(len(CH)-1):
si CH[i] == CH[i+1]:
cpt += 1
sino:
res += str(cpt)+CH[i]
cpt = 1
res += str(cpt)+CH[-1]
devolver res

imprimir(crypter("aaaFyBssssssssssssazz"))

Ejercicio 2
Se propone escribir un programa que permita ingresar y encriptar una palabra M
non vide, compuesto únicamente por letras mayúsculas y de mostrar la palabra cifrada
MC.
El método de cifrado es el siguiente:
Para cada letra, determinar su número de ocurrencias
(apareciendo en la palabra M. Determinar K que es igual a 2*nsin es impar
et sera égal à(n DIV 2)sinest pair. Remplacer chaque lettre par Kième
deja que la siga en el intervalo del alfabeto [‘A’…’Z’]. Para las últimas
letres, se rinde desde el principio, por ejemplo si K=3, se reemplazará 'A' por
‘D’,’B’ por ‘E’, ‘C’ por ‘E’… ‘Y’ por ‘B’ y ‘Z’ por ‘C’.
Ejemplo

FELIZ
La palabra cifrada será: 'JCQQA'
Escribir un programa en Python que permita ingresar una palabra no vacía y compuesta
UNIQUE PAR DES LETTRES MAJUSCULES, PUIS D'AFFICHER LE MOT CRYPTÉ SELON LE PRINCIPE
descrito arriba.
def crypter_mc(s):
alpha ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
res =''
para carta en s:
occurence = [Link](lettre)
pos = 0
si ocurrencia % 2 == 0:
pos = ocurrencia // 2
else:
pos = ocurrencia*2
ordre = [Link](lettre)
indice = pos+ordre
si indice > 25:
indice = indice % 26
res += alpha[indice]
volver res

print(crypter_mc("FELIZ"))

Ejercicio 3

Uno de los sistemas de criptografía más antiguos (fácilmente descifrable) consiste en desplazar los
lettres d’un message pour le rendre illisible. Ainsi, les A deviennent des B, les B des C, etc. Et
los Z se convierten en A
Exemple

Si CH='ABCCZABEY' entonces la cadena Rescrita que se mostrará es


‘BCDDABCEZ’
Escribe un programa que pida una cadena CH al usuario y que la codifique en una
cadena Res según este principio.

def encriptar(ch):
alpha ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
res =''
por carácter en ch:
indice = [Link](caractere)
pos = indice + 1
si pos == 26:
pos = 0
res += alpha[pos]
volver re

imprimir(crypter("ABCCZABEY"))

Ejercicio 4
Una mejora (relativa) del principio utilizado en el ejercicio 3 consiste en operar con
undécalage no de 1, sino de un número cualquiera de letras. Así, por ejemplo, si
si elegimos un desplazamiento de 3, las A se convierten en E, las B en E, etc. Y las Z
se convierten en C
Realiza un programa en python bajo el mismo principio que el anterior, pero que
pregunta además cuál es el desfase a utilizar.
def cesar(s, d):
alpha ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
res =''
para carta en s:
ordre = [Link](lettre)
indice = ordre+d
si indice > 25:
indice = indice % 26
res += alpha[indice]
regresar res

print(cesar("ABCDEFGH", 3))

Ejercicio 5

Una técnica posterior de criptografía consistió en operar no con un desplazamiento


sistematica, pero por una sustitución aleatoria. Para ello, se utiliza un alfabeto-clave,
en el que las letras se suceden de manera desordenada, por ejemplo,
"HYLUJPVREAKBNDOFSQZCWMGITX" Esta es la clave que se usará luego para codificar
el mensaje. Según nuestro ejemplo, las A se convertirán en H, las B en Y, las C en L, etc.
Ejemplo

Si CH='ABCDEFZ' entonces la cadena Res cifrada que será mostrada es 'HYLUJPX'


Escribir un programa en Python que realice este cifrado (el alfabeto clave será introducido por
el usuario, y se supone que realiza una entrada correcta) sobre una cadena de
caractères CH et stocker le résultat dans Res
def crypter_alea(msg):
cle ='HYLUJPVREAKBNDOFSQZCWMGITX'
alpha ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
res =''
por carácter en msg:
indice = [Link](caractere)
res += cle[indice]
regresar res
print(crypter_alea("ABCDEFZ"))

Ejercicio 6

Un sistema de criptografía mucho más difícil de romper que los anteriores fue
inventado en el siglo XVI por el francés Vigenère. Consistía en una combinación de
diferentes cifras de César.
De hecho, se pueden escribir 25 alfabetos desfasados en relación con el alfabeto normal:
El alfabeto que comienza con B y termina en ...YZA
El alfabeto que comienza con C y termina en ...ZAB
etc.
La codificación se llevará a cabo según el principio del cifrado César: se reemplaza la letra
de origen por la letra que ocupa el mismo lugar en el alfabeto desplazado.
Pero a diferencia del cifrado de César, un mismo mensaje va a utilizar no uno, sino
varios alfabetos desplazados. Para saber cuáles alfabetos deben ser utilizados, y en
qué orden, se utiliza una llave.
Si esta clave es "VIGENERE" y el mensaje "Es necesario codificar esta frase", procederemos
como sigue:
La primera letra del mensaje, I, es la 9ª letra del alfabeto normal. Debe ser
codificada utilizando el alfabeto que comienza con la primera letra de la clave, V. En este
alfabeto, la 9ª letra es la D. I se convierte en D.
La segunda letra del mensaje, L, es la 12a letra del alfabeto normal. Debe ser
codificado utilizando el alfabeto que comienza con la segunda letra de la clave, I. En este
alfabeto, la 12ª letra es la S. L se convierte en S, etc.
Cuando llegamos a la última letra de la clave, volvemos a empezar desde la primera.
Escribir un programa en python que realice un cifrado de Vigenère, pidiendo bien
seguro al inicio la clave al usuario.
def Vigenere(msg, cle):
alpha ='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
res =''
i=0
para carácter en mensaje:
debut = [Link](cle[i])
pos = [Link](caractere)
indice = pos+debut
si indice > 25:
indice -= 26
res += alpha[indice]
i += 1
si i >= len(cle):
i=0
regresar res

Imprimir(Vigenere("Es necesario codificar esta frase","VIGENERE"))


Ejercicio 7
Un administrador de un sitio web quiere asegurar la máxima seguridad para los
usuarios del sitio. Para esto, decide realizar una aplicación que evalúe la fuerza
las contraseñas de los diferentes usuarios del sitio, sabiendo que una contraseña es
una cadena de caracteres que no contiene espacios ni letras acentuadas.
La fuerza de una contraseña varía, según el valor de una puntuación calculada, de 'Muy débil'
hasta 'Muy fuerte':
Si la puntuación <20, la fuerza de la contraseña es 'Muy débil'
Sinon si le score<40, la force d’un mot de passe est ‘Faible’
Sinon si le score <80, la force du mot de passe est ‘Fort’
Sinon la fuerza de la contraseña es 'Muy fuerte'
La puntuación se calcula sumando bonificaciones y restando penalizaciones.
Los bonos atribuidos son:
Nombre total de caracteres * 4
(Número total de caracteres - número de letras mayúsculas) * 2
(Número total de caracteres - número de letras minúsculas) * 3
Número de caracteres no alfabéticos * 5
Las penalizaciones impuestas son:
La longitud de la secuencia más larga de letras minúsculas * 2
La longueur de la plus longue séquence de letres majuscules * 3
Ejemplo

Para la contraseña ‘P@cSI_promo2017’, la puntuación se calcula de la siguiente manera:


La suma de bous = 15*4 + (15-3) *2 + (15-6) *3+6*5=141
El número total de caracteres = 15
El número de letras mayúsculas = 3
El número de letras minúsculas=6
El número de caracteres no alfabéticos = 6
La suma de las penalizaciones = 5*2+2*2=14
La longitud de la secuencia más larga de letras minúsculas ('promo') = 5
La longitud de la secuencia más larga de letras mayúsculas ('SI') = 2
Le score final = 141-14=127 ; puisque 127>80 alors le mot de passe est considéré
muy fuerte
Travail demandé :
1. Escribir una función NbCMin(pass) que devuelva el número de caracteres
minúsculas.
2. Escribir una función NbCMaj(pass) que devuelva el número de caracteres
mayúsculas.
3. Escribir una función NbCAlphapass que devuelva el número de caracteres
non alphabétques.
4. Escribir una función LongMaj(pass) que devuelva la longitud de la más larga
secuencia de letras mayúsculas.
5. Escribir una función LongMin(pass) devuelve la longitud de la más larga
secuencia de letras minúsculas.
6. Escribir una función Score(pass) que muestre la puntuación de una contraseña
def NbcMin(passe):
nb = 0
for yo en pase:
si una <= i <='z':
nb += 1
volver nb

def NbcMaj(passe):
nb = 0
para yo en pasado
si 'A' <= i <='Z':
nb += 1
volver nb

def NbcAlpha(passe):
devolver len(passe)-NbcMaj(passe)-NbcMin(passe)

def longMaj(passe):
d=0
s=0
i=0
mientras i < len(passe):
si 'A' < passe[i] <'Z':
s += 1
sino:
si s > d:
d=s
s=0
i += 1

regresar d

def longMin(passe):
d=0
s=0
i=0
mientras i < len(passe):
if a < passe[i] < 'z':
s += 1
de lo contrario:
si s > d:
d=s
s=0
i += 1

regresar d

def puntuar(contraseña):
bonus = (len(password)-NbcMin(password)) * 3 + (len(password) -
NbcMaj(password))*2+(len(password)-NbcAlpha(password))*5
penalites = longMaj(password)*3+longMin(password)*2
val = bonificación - penalidades
si val < 20:
Muy débil
elif val < 40:
Impreso('Débil')
elif val < 80:
Fort
de lo contrario:
Muy fuerte

pas ="P@SI_promo2016"
score(pas)

Ejercicio 8
Un número feliz es un número entero que, al sumar los cuadrados de cada uno
de esos números, luego los cuadrados de los números de ese resultado y así sucesivamente hasta
la obtención de un número de un solo dígito igual a 1 (uno).
Ejemplo :
N=7 es feliz, ya que:
7 2= 49
4 2+ 92 = 97
9 2+ 72 = 130
1 2+3 2+0 =10
2

1 2+0 2=1
Hemos llegado a un número de un solo dígito que es igual a 1, por lo tanto N=7 es feliz

Trabajo solicitado:

Escribir una función feliz(nb) que permita determinar si un número entero es feliz
feliz o no.
def heureux(nb):
etat= Falso# estado del número, ¿es feliz o no por defecto el
nombre no está feliz
verificar si el número es menor que 10
nombre= str(nb)
limite= Falso
mientras limite== Falso
s= 0
para iin nombre:
s+= int(i)**2
nombre= str(s)
si nombre== '1':
etat= Verdadero
romper
si int(nombre) <10:# si el nombre<10 entonces limite=True
limite= Verdadero
devolver estado

imprimir(heureux(7))
Ejercicio 9

La suite de Robinson está definida por:


U0=0
Se construye concatenando el número de apariciones de cada uno de los
dígitos que constituyen el término Un-1 seguido del dígito en sí, según el orden
décroissant de los números, para todo n>0.
Ejemplo :
Para n=5, U5=13123110
En efecto:
U0=0
U1=10 porque hay una aparición (1) del número 0 en U0
U2=1110 porque hay una aparición (1) del número 1 y una aparición (1) de
chiffre 0 dans U1
U3=3110 porque hay una aparición (3) del número 1 y una aparición (1) del
chiffre 0 en U2
U4=132110 ya que hay una aparición (1) del número 3, dos apariciones del número
1 y una aparición (1) del número 0 en U3
U5=13123110 porque hay una aparición (1) del número 3, una aparición de
chiffre 2, tres apariciones del chiffre 1 y una aparición (1) del chi‫מּ‬re 0 en
U3
Trabajo solicitado:

Escribir una función Robinson(N) que permita calcular el enésimo término de la sucesión de
robinson
definir robinson(n):
U= 0
para _en rango(1, n+1):
ch= str(U)
L= [0,0,0,0,0,0,0,0,0,0]
para chifrein ch:
L[int(dígito)] += 1
res= ''
para jin rango(9,-1,-1):
si L[j] != 0:
res+= str(L[j]) + str(j)
U= int(res)
print('Término : ', n,' es ', U)

robinson(5)

Ejercicio 10
En un contexto aritmético, se definen los números primos factoriales y los
números primos primoriales como se indica a continuación.
Un nombre PF est dit premier factoriel s’il vérifie les deux propriétés suivantes :
PF es un número primo
Et PF se escribe en forma de un factorial incrementado o decrementado de 1
(PF=F! + 1 o PF=F! - 1), sabiendo que el factorial de F denotado F! es igual a
F*(F-1) *…*1
Ejemplo

7 es un número primo factorial porque 7 es primo y se escribe en forma de


3! + 1.
719 es un número primo factorial porque 719 es primo y se escribe bajo la
forma 6! - 1.
Un nombre PP se dice primo primorial si verifica las dos propiedades siguientes:
PP es un número primo
PP se escribe en forma de una primordial incrementada o decrementada de 1
(PP=P#+1 o PP=P#-1), sabiendo que la primordial de P, denotada P#, es igual
produjo números primos menores o iguales a P.
Ejemplo

211 es un número primo primorial porque 211 es primo y se escribe bajo la


forma 7# + 1. En efecto, 7#+1=2*3*5*7 + 1 =210 + 1=211
30029 es un número primo primorial porque 30029 es primo y se escribe
bajo la forma 13# - 1. De hecho, 13# - 1 = 2*3*5*7*11*13-1=30030 - 1
=30029
Trabajo solicitado:
1. Escribir una función premier_fact(n) que permita verificar si n es
un número primo factorial o no
2. Escribir una función primo_primorial(n) que permita verificar si n
es un número primo primordial o no
def premier(n):
etat= Verdadero
para iin rango(2, (n//2)+1):
si n% i== 0:
etat= Falso
romper
regresar etat

def premier_fact(n):
etat= False
si premier(n):
f= 1
ordre= 2
mientras f < n:
f= f*ordre
ordre+= 1
si f+1 == ni f-1 == n:
etat= Verdadero
devuelve estado
def premier_primoriel(n):
etat= Falso
si premier(n)== Verdadero
p= 3
s= 0
mientras s < n:
s= 1
por iin rango(2, p+1):
si premier(i)== Verdadero
s= s*i
p+= 1
si s+1 == ni s-1 == n:
etat= Verdadero
romper
regresar estado

n= 719
print(premier_fact(n))

También podría gustarte