Otro Cifrador/Descifrador por desplazamiento, Decimación y Afin

Iniciado por darkucla, Enero 17, 2020, 08:26:30 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

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

Código: python

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....
Código: python

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...

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