Criptografía en Python: Ejercicios y Soluciones
Criptografía en Python: Ejercicios y Soluciones
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
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
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
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
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
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
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))