comment
IRC Chat
play_arrow
Este sitio utiliza cookies propias y de terceros. Si continúa navegando consideramos que acepta el uso de cookies. OK Más Información.

Azav Cipher Algorithm

  • 1 Respuestas
  • 2003 Vistas

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

Desconectado Azav

  • *
  • Underc0der
  • Mensajes: 23
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« en: Octubre 10, 2014, 12:38:57 am »
¡Buenas a todos!

Vengo a dejarles aquí un código para encriptar y desencriptar texto. Lo he llamado Azav Cipher, lo he creado completamente yo en Python 3.4

Características del cifrado:
+ No tiene una cantidad máxima de caracteres a encriptar.
+ No usa clave.
+ Para un mismo texto plano se generan siempre textos encriptados diferentes y no siempre de igual largo (lo hice así intencionalmente).
+ Desencripta perfecto cualquiera de los textos encriptados.
+ En esta segunda versión le he creado una GUI con tkinter, bastante simple pero ha quedado bien.

Código: Python
  1. from random import randint, choice
  2. from tkinter import Tk, messagebox, Text, Button
  3.  
  4. def encode(string):
  5.         #Pasamos a binario el mensaje original:
  6.         binMSG = ""
  7.         i = 0
  8.         while i < len(string):
  9.                 caracter_MSG_binario = bin(ord(string[i])).replace("0b", "").zfill(8)
  10.                 binMSG = binMSG + caracter_MSG_binario
  11.                 i += 1
  12.         #Dividimos el mensaje binario en dos cadenas de igual largo.
  13.         Segmento1 = binMSG[:(int(len(binMSG)/2))]
  14.         Segmento2 = binMSG[(int(len(binMSG)/2)):]
  15.         #A cada segmento agregamos una cadena aleotoria inicial para generar encriptaciones diferentes para un mismo mensaje.
  16.         Segmento1 = random_bin_chain(8) + Segmento1
  17.         Segmento2 = random_bin_chain(8) + Segmento2    
  18.         # (0 = @), (1 = $), (1 = &), (2 = *)
  19.         i = 0
  20.         cadena_final = ""
  21.         while i < len(Segmento1):
  22.                 if Segmento1[i] == Segmento2[i] == "0":
  23.                         cadena_final += "@"
  24.                 elif Segmento1[i] == Segmento2[i] == "1":
  25.                         cadena_final += "$"
  26.                 elif Segmento1[i] == "1" and Segmento2[i] == "0":
  27.                         cadena_final += "&"
  28.                 elif Segmento1[i] == "0" and Segmento2[i] == "1":
  29.                         cadena_final += "*"
  30.                 i += 1
  31.         #Transformamos los simbolos en caracteres normales (letras y numeros) y acortamos la cadena a la mitad.
  32.         simbolos = ["@", "$", "&", "*"]
  33.         valores = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.="
  34.         i = k = 0
  35.         while i < 4:
  36.                 for elemento in simbolos:
  37.                         match = elemento + simbolos[i]
  38.                         coincidencias = cadena_final.count(match)
  39.                         j = 1
  40.                         while j <= coincidencias:
  41.                                 cadena_final = cadena_final.replace(match, choice(valores[k:k+4]), 1)
  42.                                 j += 1
  43.                         k += 4
  44.                 i += 1
  45.         return cadena_final
  46.         #El largo de la cadena final es siempre mayor a 2*(string + 2)
  47.         #El largo de la cadena final es siempre menor a (8/3)*(string + 2)
  48.  
  49. def decode(string):
  50.         simbolos = ["@", "$", "&", "*"]
  51.         valores = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ.="
  52.         #Lo primero es obtener la cadena de simbolos ["@", "$", "&", "*"]
  53.         #Para ello transformamos las letras en simbolos.
  54.         listavalores = []
  55.         k = 0
  56.         while (k+4) <= len(valores):
  57.                 listavalores.append(valores[k:k+4])
  58.                 k += 4
  59.        
  60.         i = k = 0
  61.         while i < 4:
  62.                 for elemento in simbolos:
  63.                         match = elemento + simbolos[i]
  64.                         for caracter in listavalores[k]:
  65.                                 string = string.replace(caracter, match)
  66.                         k += 1
  67.                 i += 1
  68.         cadena_simbolos = string[8:]
  69.         #La cadena de simbolos representa la suma de los dos segmentos del mensaje
  70.         segmento1 = segmento2 = ""
  71.         for elemento in cadena_simbolos:
  72.                 if elemento == "@":
  73.                         segmento1 = segmento1 + "0"
  74.                         segmento2 = segmento2 + "0"
  75.                 elif elemento == "$":
  76.                         segmento1 = segmento1 + "1"
  77.                         segmento2 = segmento2 + "1"
  78.                 elif elemento == "&":
  79.                         segmento1 = segmento1 + "1"
  80.                         segmento2 = segmento2 + "0"
  81.                 elif elemento == "*":
  82.                         segmento1 = segmento1 + "0"
  83.                         segmento2 = segmento2 + "1"
  84.         cadena_binaria = segmento1 + segmento2
  85.         #Ahora queda transformar la cadena binaria a texto plano.
  86.         if (len(cadena_binaria) % 8) == 0:
  87.                 repeticiones = (len(cadena_binaria) // 8)
  88.                 j = k = 0
  89.                 valor_original = ""
  90.                 while k <= (repeticiones - 1):
  91.                         segmento_8 = cadena_binaria[j:j + 8]
  92.                         ascii_value = bin_to_ascii(segmento_8)
  93.                         str_value = chr(ascii_value)
  94.                         valor_original = valor_original + str(str_value)
  95.                         j += 8
  96.                         k += 1
  97.         else:
  98.                 return ("Invalid text to decode.")
  99.         return valor_original
  100.  
  101. def random_bin_chain(large):   
  102.         binary_chain = ""
  103.         for i in range(0, large):
  104.                 binary_chain = binary_chain + str(randint(0, 1))
  105.         return binary_chain
  106.        
  107. def bin_to_ascii(bin_number):
  108.     bin_number_str = str(bin_number)
  109.     if len(bin_number_str) == 8:
  110.         i = 0
  111.         dec_number = 0
  112.         while i <= 7:
  113.             dec_number = dec_number + (int(bin_number_str[i]) * (2 ** (7 - i)))
  114.             i += 1
  115.         return dec_number
  116.     else:
  117.         return "Error decoding."
  118.                
  119. def load_GUI():
  120.         def EncodeClicked():
  121.                 string = txtInput.get('1.0', 'end').strip()
  122.                 if len(string) > 0:
  123.                         result = encode(string)
  124.                         txtInput.delete('1.0', 'end')
  125.                         txtInput.insert('1.0', result)
  126.                 else:
  127.                         messagebox.showwarning("Azav Cipher","The plain text must contain at least 1 character.")
  128.        
  129.         def DecodeClicked():
  130.                 string = txtInput.get('1.0', 'end').strip()
  131.                 if len(string) >= 4:
  132.                         if decode(string) != "Invalid text to decode.":
  133.                                 result = decode(string)
  134.                                 txtInput.delete('1.0', 'end')
  135.                                 txtInput.insert('1.0', result)
  136.                         else:
  137.                                 messagebox.showwarning("Azav Cipher","The encoded text is not valid to decode.")
  138.                 else:
  139.                         messagebox.showwarning("Azav Cipher","The encoded text must contain at least 4 characters.")
  140.  
  141.         #Main Window
  142.         mainWindow = Tk()
  143.         mainWindow.geometry("520x270")
  144.         mainWindow.title("Azav Cipher")
  145.         #TextBox
  146.         txtInput = Text(mainWindow, height="12", width="60", relief = 'flat')
  147.         txtInput.place(x=20, y=20)
  148.         #Encode & Decode Buttons
  149.         cmdEncode = Button(mainWindow,  text = 'Encode', width = 30, command = lambda:EncodeClicked()).place(x=20, y = 230)
  150.         cmdEncode = Button(mainWindow,  text = 'Decode', width = 30, command = lambda:DecodeClicked()).place(x=285, y = 230)
  151.         #Start
  152.         mainWindow.mainloop()
  153.  
  154.                
  155. load_GUI()
  156.  

¡Espero a alguien le sirva!  ;)

Desconectado Once

  • *
  • Underc0der
  • Mensajes: 385
  • Actividad:
    5%
  • Reputación 0
    • Ver Perfil
    • El blog de Once
  • Twitter: @don_once
« Respuesta #1 en: Octubre 11, 2014, 06:45:15 pm »
Interesante brother, te dejo +1

Saludos!






You are not allowed to view links. Register or Login

 

¿Te gustó el post? COMPARTILO!



NumSys Calculator by Azav

Iniciado por Azav

Respuestas: 2
Vistas: 1182
Último mensaje Enero 23, 2015, 12:07:14 pm
por Barlan