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

  • 1 Respuestas
  • 293 Vistas

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

Desconectado darkucla

  • *
  • Underc0der
  • Mensajes: 9
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
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
  1. def Cifrado(bolCifrar=True):
  2.    # strTexto, intROT=0, strTipoDeCifrado="desplazamiento", intMod=27, intAfin=1, bolCifrar=True):
  3.    # M = Mensaje a Cifrar
  4.    # C = Mensaje Cifrado
  5.    # n = Longitud del Alfabeto, default 27
  6.    # (Des)Cifrado por Desplazamiento (Cesar) a = 1, b = ROT
  7.    # (Des)Cifrado por Decimación  a = salto o 'decimación',  b = 0
  8.    # (Des)Cifrado Afín   a = salto o 'decimación',  b = ROT
  9.    strTexto = input("Mensaje: ").upper()
  10.    if not bolCifrar:
  11.       strOpcion = int(input("(1) Tengo los datos.... (2) Letra mas frecuente es E.... (3) Fuerza Bruta: "))
  12.    else:
  13.       strOpcion = 1
  14.    
  15.    lstABC = list(chr(x) for x in range(65,91))
  16.    lstABC.insert(14,"Ñ")
  17.    if strOpcion == 3:
  18.       for b in range(len(lstABC) + 1):
  19.          for a in range(len(lstABC)):
  20.             Cifrado2(strTexto, b, a, 27, False)
  21.  
  22.    elif strOpcion == 2:
  23.       lstRepetidas = []
  24.       for strLetra in lstABC:
  25.          lstRepetidas.append(strTexto.count(strLetra))
  26.       intNumMax = max(lstRepetidas)
  27.       b = lstRepetidas.index(intNumMax)
  28.       a = 1
  29.       n = 27
  30.       Cifrado2(strTexto, b-4, a, n, False)
  31.       Cifrado2(strTexto, b, a, n, False)
  32.    else:
  33.       b = int(input("Desplazamiento (b): "))
  34.       a = int(input("Decimación (a=1): "))
  35.       n = int(input("Alfabeto (n=27 con ñ): "))
  36.       Cifrado2(strTexto, b, a, n, True)
  37.  
  38.    
  39.  
  40. def Cifrado2(strTexto, b=0, a=1, n=27, bolCifrar=True):
  41.    lstABC = list(chr(x) for x in range(65,91))
  42.    if n == 27:
  43.       lstABC.insert(14,"Ñ")
  44.    strCadena = ""
  45.  
  46.    for strLetra in strTexto:
  47.       if strLetra in lstABC:
  48.          intMC = lstABC.index(strLetra)
  49.          if bolCifrar:
  50.             intIndexCodificado = (( a * intMC) + b ) % len(lstABC)
  51.          else:
  52.             intIndexCodificado = ((intMC - b) * modInv( a, len(lstABC))) % len(lstABC)
  53.          strLetra = lstABC[intIndexCodificado]
  54.       strCadena += strLetra
  55.    #return strCadena
  56.    print("\nConversión: ",strCadena)
  57.  
  58.  
  59.  
  60.  
  61. def xgcd(a, b):
  62.     """Calcula el greater common divisor (gcd)/ máximo común divisor de a y b.
  63.        Utiliza el algoritmo extendido de Euclides.
  64.  
  65.    Args:
  66.        a: mcd(a,b)=resultado
  67.        b: mcd(a,b)=resultado
  68.    Returns:
  69.        Returns mcd(a,b) and (u0,v0)
  70.  
  71.    """
  72.     if b == 0:
  73.         return 0,1,0
  74.  
  75.     u0 = 1
  76.     u1 = 0
  77.     v0 = 0
  78.     v1 = 1
  79.  
  80.     while b != 0:
  81.         q = a//b
  82.         r = a - b * q
  83.         u = u0 - q * u1
  84.         v = v0 - q * v1
  85.         #Update a,b
  86.         a = b
  87.         b = r
  88.         #Update for next iteration
  89.         u0 = u1
  90.         u1 = u
  91.         v0 = v1
  92.         v1 = v
  93.  
  94.     return  a, u0, v0
  95. def modInv(n, a):
  96.     """Calcula el inverso de a módulo n.
  97.       Utiliza el algoritmo extendido de Euclides para ello.
  98.  
  99.    Args:
  100.        a: número del que se calcula el módulo
  101.        n: módulo del inverso
  102.    
  103.    Returns:
  104.        inverso de a módulo n
  105.  
  106.    """
  107.     mcd , u , v = xgcd(n,a)
  108.     if mcd != 1:
  109.        # print("No existe inverso")
  110.         return 0
  111.      
  112.     return u%a
  113.  
  114.  

Este es el programa principal....
Código: Python
  1. while 1:
  2.    print("Menú Cifrado")
  3.    print("1.- Cifrar Mensaje\tC = ( ( a * M ) + b ) mod n")
  4.    print("2.- Descifrar Mensaje\tM = ( ( C - b ) * inv( a, n ) ) mod n")
  5.    print("3.- Salir")
  6.    print("""
  7.   M = Mensaje a Cifrar
  8.   C = Mensaje Cifrado
  9.   n = Longitud del Alfabeto, default 27
  10.   (Des)Cifrado por Desplazamiento (Cesar) a = 1, b = ROT
  11.   (Des)Cifrado por Decimación  a = salto o 'decimación',  b = 0
  12.   (Des)Cifrado Afín   a = salto o 'decimación',  b = ROT""")
  13.    strOpcion = input("Opción: ").strip()
  14.    if strOpcion == "3":
  15.       break
  16.    if strOpcion == "1":
  17.       Cifrado(True)
  18.      
  19.    if strOpcion == "2":
  20.       Cifrado(False)
  21.  
  22.  

Y el ejemplo...

Conectado noxonsoftwares

  • *
  • Ex-Staff
  • *****
  • Mensajes: 309
  • Actividad:
    23.33%
  • Country: 00
  • Reputación 7
  • Ayudar es Crecer, Crecer es Mejorar
  • Skype: noxonsoftwares
    • Ver Perfil
    • NOXONSOFTWARES
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

 

[pyDownloader] Descargar videos de youtube y convertirlos a otro formato

Iniciado por $francisco

Respuestas: 2
Vistas: 2171
Último mensaje Junio 07, 2015, 07:49:47 am
por $francisco
[Mi primer code] Cifrador de texto

Iniciado por KrossPock

Respuestas: 2
Vistas: 2072
Último mensaje Enero 30, 2014, 09:47:46 am
por CrazyKade