Qué tal amiguitos....
He tratado de "mejorar"el código del cifrado de César (desplazamiento) y pues seguí leyendo y ví eso de la decimación y afín...
Así que me hice un poco bolas, pero para empezar les traigo lo que llevo...está bien que lo ponga tan silvestre?.. o necesitaba detallarlo más?
Luego lo termino... o me pueden aconsejar ...voy bien?... algún otro tipo de encriptación que deba agregar? saludos
def Cifrado(bolCifrar=True):
# strTexto, intROT=0, strTipoDeCifrado="desplazamiento", intMod=27, intAfin=1, bolCifrar=True):
# M = Mensaje a Cifrar
# C = Mensaje Cifrado
# n = Longitud del Alfabeto, default 27
# (Des)Cifrado por Desplazamiento (Cesar) a = 1, b = ROT
# (Des)Cifrado por Decimación a = salto o 'decimación', b = 0
# (Des)Cifrado Afín a = salto o 'decimación', b = ROT
strTexto = input("Mensaje: ").upper()
if not bolCifrar:
strOpcion = int(input("(1) Tengo los datos.... (2) Letra mas frecuente es E.... (3) Fuerza Bruta: "))
else:
strOpcion = 1
lstABC = list(chr(x) for x in range(65,91))
lstABC.insert(14,"Ñ")
if strOpcion == 3:
for b in range(len(lstABC) + 1):
for a in range(len(lstABC)):
Cifrado2(strTexto, b, a, 27, False)
elif strOpcion == 2:
lstRepetidas = []
for strLetra in lstABC:
lstRepetidas.append(strTexto.count(strLetra))
intNumMax = max(lstRepetidas)
b = lstRepetidas.index(intNumMax)
a = 1
n = 27
Cifrado2(strTexto, b-4, a, n, False)
Cifrado2(strTexto, b, a, n, False)
else:
b = int(input("Desplazamiento (b): "))
a = int(input("Decimación (a=1): "))
n = int(input("Alfabeto (n=27 con ñ): "))
Cifrado2(strTexto, b, a, n, True)
def Cifrado2(strTexto, b=0, a=1, n=27, bolCifrar=True):
lstABC = list(chr(x) for x in range(65,91))
if n == 27:
lstABC.insert(14,"Ñ")
strCadena = ""
for strLetra in strTexto:
if strLetra in lstABC:
intMC = lstABC.index(strLetra)
if bolCifrar:
intIndexCodificado = (( a * intMC) + b ) % len(lstABC)
else:
intIndexCodificado = ((intMC - b) * modInv( a, len(lstABC))) % len(lstABC)
strLetra = lstABC[intIndexCodificado]
strCadena += strLetra
#return strCadena
print("\nConversión: ",strCadena)
def xgcd(a, b):
"""Calcula el greater common divisor (gcd)/ máximo común divisor de a y b.
Utiliza el algoritmo extendido de Euclides.
Args:
a: mcd(a,b)=resultado
b: mcd(a,b)=resultado
Returns:
Returns mcd(a,b) and (u0,v0)
"""
if b == 0:
return 0,1,0
u0 = 1
u1 = 0
v0 = 0
v1 = 1
while b != 0:
q = a//b
r = a - b * q
u = u0 - q * u1
v = v0 - q * v1
#Update a,b
a = b
b = r
#Update for next iteration
u0 = u1
u1 = u
v0 = v1
v1 = v
return a, u0, v0
def modInv(n, a):
"""Calcula el inverso de a módulo n.
Utiliza el algoritmo extendido de Euclides para ello.
Args:
a: número del que se calcula el módulo
n: módulo del inverso
Returns:
inverso de a módulo n
"""
mcd , u , v = xgcd(n,a)
if mcd != 1:
# print("No existe inverso")
return 0
return u%a
Este es el programa principal....
while 1:
print("Menú Cifrado")
print("1.- Cifrar Mensaje\tC = ( ( a * M ) + b ) mod n")
print("2.- Descifrar Mensaje\tM = ( ( C - b ) * inv( a, n ) ) mod n")
print("3.- Salir")
print("""
M = Mensaje a Cifrar
C = Mensaje Cifrado
n = Longitud del Alfabeto, default 27
(Des)Cifrado por Desplazamiento (Cesar) a = 1, b = ROT
(Des)Cifrado por Decimación a = salto o 'decimación', b = 0
(Des)Cifrado Afín a = salto o 'decimación', b = ROT""")
strOpcion = input("Opción: ").strip()
if strOpcion == "3":
break
if strOpcion == "1":
Cifrado(True)
if strOpcion == "2":
Cifrado(False)
Y el ejemplo...
(https://i.imgur.com/IXDAJ6U.png)
Genial, felicitaciones.
En estos dias estare conpartiendo algo parecido pero basado en un script que ya habia compartido anteriormente (obvio que este estara mejor xD)
Saludos