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.

[GUI] Cifrado Caesar

  • 7 Respuestas
  • 2089 Vistas

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

Desconectado Barlan

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • "The demons of my own design"
    • Ver Perfil
  • Twitter: @BarlanV
« en: Mayo 11, 2015, 03:03:12 am »
Hola a todos!

Hice una GUI para cifrar y descifrar cadenas con el método de Caesar.
(me basé en el code de: You are not allowed to view links. Register or Login | Si quieren más detalles de este método, visiten la página o visiten wikipedia. xD)

Etimología:
Citar
El cifrado César recibe su nombre en honor a Julio César, que, según Suetonio, lo usó con un desplazamiento de tres espacios para proteger sus mensajes importantes de contenido militar.

El programa está dividido en 2:
    - GUI
    - libreria caesar.py
(el que nos cifrará/descifrará la cadena)

gui.py :
Código: Python
  1. # -*- coding:utf-8 -*-
  2. __author__ = "Barlan"
  3.  
  4. from caesar import Caesar   # Cifrado Cesar
  5. from tkinter import *
  6.  
  7. class GUI(Tk):
  8.     def __init__(self):
  9.         Tk.__init__(self)
  10.         self.title("GUI | Cifrado Caesar")
  11.         self.resizable(0,0)
  12.         self.config(bg="black")
  13.  
  14.         self.i = IntVar()
  15.         self.s = StringVar()
  16.  
  17.         Label(self, text="Cadena: ", bg="black", fg="white").grid(row=0, column=0)
  18.         self.cadena = Entry(self, textvariable=self.s, width=30)
  19.         self.cadena.grid(row=0, column=1)
  20.  
  21.         Label(self, text="Clave a usar: ", bg="black", fg="white").grid(row=1, column=0)
  22.         self.clave = Entry(self, width=20)
  23.         self.clave.grid(row=1, column=1)
  24.  
  25.         self.rc = Radiobutton(self, text="Encriptar", variable=self.i, value=1, command=self.toCaesar, bg="black", fg="white")
  26.         self.rc.grid(row=2, column=0)
  27.  
  28.         self.rd = Radiobutton(self, text="Desencriptar", variable=self.i, value=2, command=self.toCaesar, bg="black", fg="white")
  29.         self.rd.grid(row=2, column=1)
  30.  
  31.         Label(self, text="Resultado:", bg="black", fg="red", relief=RIDGE).grid(row=3, column=0, columnspan=2)
  32.  
  33.     def toCaesar(self):
  34.         if self.i.get() == 1:
  35.             cadena = self.cadena.get().upper()
  36.             clv = int(self.clave.get())
  37.             r = Caesar()
  38.             a = r.cifrar(cadena, clv)
  39.  
  40.             Label(self, text=a, bg="black", fg="white", relief=RIDGE).grid(row=4, column=0, columnspan=2, sticky=NSEW)
  41.  
  42.         elif self.i.get() == 2:
  43.             cadena = self.cadena.get().upper()
  44.             clv = int(self.clave.get())
  45.             r = Caesar()
  46.             a = r.descifrar(cadena, clv)
  47.  
  48.             Label(self, text=a, bg="black", fg="white", relief=RIDGE).grid(row=4, column=0, columnspan=2, sticky=NSEW)
  49.  
  50. GUI().mainloop()
  51.  

caesar.py :
Código: Python
  1. # -*- coding: utf-8 -*-
  2.  
  3. class Caesar():
  4.     def __init__(self):
  5.         # Lista de caracteres a usar.
  6.         self.caract = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ0123456789"
  7.  
  8.     def cifrar(self, cadena, clv):
  9.         '''
  10.        Función que cifrará nuestro mensaje, a partir de la cadena y clave proporcionada.
  11.        '''
  12.         resultado = ""
  13.         for letra in cadena:
  14.             if letra == " ":
  15.                 resultado += " "
  16.             else:
  17.                 op = self.caract.find(letra) + clv
  18.                 modulada = int(op) % 37
  19.                 resultado = resultado + str(self.caract[modulada])
  20.  
  21.         return(resultado)
  22.  
  23.     def descifrar(self, cadena, clv):
  24.         '''
  25.        Función que descifrará nuestro mensaje cifrado, a partir de una clave y cadena proporcionada.
  26.        '''
  27.         resultado = ""
  28.         for letra in cadena:
  29.             if letra == " ":
  30.                 resultado += " "
  31.             else:
  32.                 op = self.caract.find(letra) - clv
  33.                 modulada = int(op) % 37
  34.                 resultado = resultado + str(self.caract[modulada])
  35.  
  36.         return(resultado)
  37.  
  38.  


Ejemplo de uso:


Si vemos, cada letra nueva se encuentra a 2 letras distantes de la original.

B + 2 = D
A + 2 = C
R + 2 = T
L + 2 = N
A + 2 = C
N + 2 = O

Lo mismo sucede al descifrarla, solo que ahora "retrocedemos" de caracteres:

D - 2 = B
C - 2 = A
T - 2 = R
N - 2 = L
C - 2 = A
O   2 = N


Saludos!
« Última modificación: Mayo 11, 2015, 02:37:49 pm por BarlanV »


Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #1 en: Mayo 11, 2015, 01:52:29 pm »
Muy bueno Barlan! Muchas gracias por compartir tus trabajos con nosotros.

Aprovecho para dejar mi código hecho con kivy.

cesar.py
Código: Python
  1. #/usr/bin/env python
  2. # -*- encoding: utf8 -*-
  3.  
  4. from kivy.app import App
  5. from kivy.uix.gridlayout import GridLayout
  6. from kivy.uix.textinput import TextInput
  7. from kivy.uix.label import Label
  8. from kivy.uix.button import Button
  9. from kivy.uix.popup import Popup
  10. from kivy.properties import ObjectProperty
  11.  
  12.  
  13. class Ui_Cesar(GridLayout):
  14.    
  15.     textInputText = ObjectProperty()
  16.     textInputOffset = ObjectProperty()
  17.  
  18.     def run(self, *args):
  19.         self.text = self.textInputText.text
  20.         self.offset = self.textInputOffset.text
  21.         op = args[0].text.lower()
  22.  
  23.         error = self.check()
  24.         if error:
  25.             return self.notify(error, True)
  26.  
  27.         if op == "code":
  28.             result = self.code()
  29.         else:
  30.             result = self.decode()
  31.  
  32.         self.notify(result)
  33.  
  34.     def check(self):
  35.         try:
  36.             text = self.text.lower()
  37.             offset = int(self.offset)
  38.  
  39.             if offset < 0:
  40.                 offset = -(offset)
  41.  
  42.             while offset > 25:
  43.                 offset -= 26
  44.  
  45.             self.text = text
  46.             self.offset = offset
  47.  
  48.         except TypeError as e:
  49.             return "It is not possible to perform the operation."
  50.  
  51.         except ValueError:
  52.             return "Offset must be an integer."
  53.  
  54.     def code(self):
  55.         result = ""
  56.  
  57.         for char in self.text:
  58.                 value = ord(char)
  59.  
  60.                 if 97 <= value <= 122:
  61.                     offsetValue = value + self.offset
  62.  
  63.                     if offsetValue > 122:
  64.                         offsetValue -= 26
  65.  
  66.                     offsetChar = chr(offsetValue)
  67.  
  68.                     result = result + offsetChar
  69.  
  70.                 else:
  71.                     result = result + char
  72.  
  73.         return result
  74.  
  75.     def decode(self):
  76.         result = ""
  77.  
  78.         for char in self.text:
  79.             value = ord(char)
  80.  
  81.             if 97 <= value <= 122:
  82.                 offsetValue = value - self.offset
  83.  
  84.                 if offsetValue < 97:
  85.                     offsetValue += 26
  86.  
  87.                 offsetChar = chr(offsetValue)
  88.  
  89.                 result = result + offsetChar
  90.  
  91.             else:
  92.                 result = result + char
  93.  
  94.         return result
  95.  
  96.     def notify(self, data, *args):
  97.         box = GridLayout()
  98.         box.cols = 1
  99.  
  100.         textInputResult = TextInput(text=data, size_hint=(1, 4))
  101.         labelError = Label(text=data, size_hint=(1, 4))
  102.  
  103.         if args:
  104.             box.add_widget(labelError)
  105.         else:
  106.             box.add_widget(textInputResult)
  107.  
  108.         buttonOk = Button(text="Ok", size_hint=(1, 1))
  109.         box.add_widget(buttonOk)
  110.  
  111.         popup = Popup(title='Notification',
  112.             content=box,
  113.             auto_dismiss=False)
  114.  
  115.         buttonOk.bind(on_press=popup.dismiss)
  116.  
  117.         popup.open()
  118.  
  119.  
  120. class Cesar(App):
  121.     def build(self):
  122.         return Ui_Cesar()
  123.  
  124.  
  125. if __name__ == "__main__":
  126.     c = Cesar()
  127.     c.run()

cesar.kv
Código: Python
  1. Ui_Cesar:
  2.  
  3. <Ui_Cesar>:
  4.     cols: 2
  5.  
  6.     textInputText: text
  7.     textInputOffset: offset
  8.  
  9.     Label:
  10.         text: "Text"
  11.         size_hint: (1, 3)
  12.  
  13.     TextInput:
  14.         id: text
  15.         multiline: True
  16.         size_hint: (1, 3)
  17.  
  18.     Label:
  19.         text: "Offset"
  20.  
  21.     TextInput:
  22.         id: offset
  23.         password: False
  24.         multiline: False
  25.  
  26.     Button:
  27.         text: "Code"
  28.         on_press: root.run(self)
  29.  
  30.     Button:
  31.         text: "Decode"
  32.         on_press: root.run(self)

Y un gif para continuar con tu estilo xD





Saludos!
WhiZ


Desconectado Gus Garsaky

  • *
  • Underc0der
  • Mensajes: 93
  • Actividad:
    0%
  • Reputación -1
    • Ver Perfil
  • Skype: gus.garsaky
« Respuesta #2 en: Mayo 11, 2015, 01:58:55 pm »
Muy buenos aportes los dos. @WhiZ, muy chulo quedan las UI con Kivy, además por lo que veo es un proyecto FOSS. Me viene muy bien ahora que estoy dándole a Python.

Saludos.

Desconectado Barlan

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • "The demons of my own design"
    • Ver Perfil
  • Twitter: @BarlanV
« Respuesta #3 en: Mayo 11, 2015, 02:07:38 pm »
You are not allowed to view links. Register or Login
Muy bueno Barlan! Muchas gracias por compartir tus trabajos con nosotros.

Aprovecho para dejar mi código hecho con kivy.

cesar.py
Código: Python
  1. #/usr/bin/env python
  2. # -*- encoding: utf8 -*-
  3.  
  4. from kivy.app import App
  5. from kivy.uix.gridlayout import GridLayout
  6. from kivy.uix.textinput import TextInput
  7. from kivy.uix.label import Label
  8. from kivy.uix.button import Button
  9. from kivy.uix.popup import Popup
  10. from kivy.properties import ObjectProperty
  11.  
  12.  
  13. class Ui_Cesar(GridLayout):
  14.    
  15.     textInputText = ObjectProperty()
  16.     textInputOffset = ObjectProperty()
  17.  
  18.     def run(self, *args):
  19.         self.text = self.textInputText.text
  20.         self.offset = self.textInputOffset.text
  21.         op = args[0].text.lower()
  22.  
  23.         error = self.check()
  24.         if error:
  25.             return self.notify(error, True)
  26.  
  27.         if op == "code":
  28.             result = self.code()
  29.         else:
  30.             result = self.decode()
  31.  
  32.         self.notify(result)
  33.  
  34.     def check(self):
  35.         try:
  36.             text = self.text.lower()
  37.             offset = int(self.offset)
  38.  
  39.             if offset < 0:
  40.                 offset = -(offset)
  41.  
  42.             while offset > 25:
  43.                 offset -= 26
  44.  
  45.             self.text = text
  46.             self.offset = offset
  47.  
  48.         except TypeError as e:
  49.             return "It is not possible to perform the operation."
  50.  
  51.         except ValueError:
  52.             return "Offset must be an integer."
  53.  
  54.     def code(self):
  55.         result = ""
  56.  
  57.         for char in self.text:
  58.                 value = ord(char)
  59.  
  60.                 if 97 <= value <= 122:
  61.                     offsetValue = value + self.offset
  62.  
  63.                     if offsetValue > 122:
  64.                         offsetValue -= 26
  65.  
  66.                     offsetChar = chr(offsetValue)
  67.  
  68.                     result = result + offsetChar
  69.  
  70.                 else:
  71.                     result = result + char
  72.  
  73.         return result
  74.  
  75.     def decode(self):
  76.         result = ""
  77.  
  78.         for char in self.text:
  79.             value = ord(char)
  80.  
  81.             if 97 <= value <= 122:
  82.                 offsetValue = value - self.offset
  83.  
  84.                 if offsetValue < 97:
  85.                     offsetValue += 26
  86.  
  87.                 offsetChar = chr(offsetValue)
  88.  
  89.                 result = result + offsetChar
  90.  
  91.             else:
  92.                 result = result + char
  93.  
  94.         return result
  95.  
  96.     def notify(self, data, *args):
  97.         box = GridLayout()
  98.         box.cols = 1
  99.  
  100.         textInputResult = TextInput(text=data, size_hint=(1, 4))
  101.         labelError = Label(text=data, size_hint=(1, 4))
  102.  
  103.         if args:
  104.             box.add_widget(labelError)
  105.         else:
  106.             box.add_widget(textInputResult)
  107.  
  108.         buttonOk = Button(text="Ok", size_hint=(1, 1))
  109.         box.add_widget(buttonOk)
  110.  
  111.         popup = Popup(title='Notification',
  112.             content=box,
  113.             auto_dismiss=False)
  114.  
  115.         buttonOk.bind(on_press=popup.dismiss)
  116.  
  117.         popup.open()
  118.  
  119.  
  120. class Cesar(App):
  121.     def build(self):
  122.         return Ui_Cesar()
  123.  
  124.  
  125. if __name__ == "__main__":
  126.     c = Cesar()
  127.     c.run()

cesar.kv
Código: Python
  1. Ui_Cesar:
  2.  
  3. <Ui_Cesar>:
  4.     cols: 2
  5.  
  6.     textInputText: text
  7.     textInputOffset: offset
  8.  
  9.     Label:
  10.         text: "Text"
  11.         size_hint: (1, 3)
  12.  
  13.     TextInput:
  14.         id: text
  15.         multiline: True
  16.         size_hint: (1, 3)
  17.  
  18.     Label:
  19.         text: "Offset"
  20.  
  21.     TextInput:
  22.         id: offset
  23.         password: False
  24.         multiline: False
  25.  
  26.     Button:
  27.         text: "Code"
  28.         on_press: root.run(self)
  29.  
  30.     Button:
  31.         text: "Decode"
  32.         on_press: root.run(self)

Y un gif para continuar con tu estilo xD





Saludos!
WhiZ

"Un GIF vale más que mil imágenes" (xD)

Muy completo code el tuyo.
Kivy me recuerda al chocolate, y me dan ganas de lanzarme hacia el.
¿No tienes algo con qué empezar?  En estos momentos no estoy en "condiciones" para estar buscando en Google (tarea xD)

Saludos!


Desconectado WhiZ

  • *
  • Underc0der
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
« Respuesta #4 en: Mayo 11, 2015, 02:12:00 pm »
You are not allowed to view links. Register or Login
@WhiZ, muy chulo quedan las UI con Kivy, además por lo que veo es un proyecto FOSS. Me viene muy bien ahora que estoy dándole a Python.

Sí. Pero eso no es lo mejor que tiene kivy. Es un framework muy organizado y que, además, permite portar tus apps a android.

You are not allowed to view links. Register or Login
¿No tienes algo con qué empezar?  En estos momentos no estoy en "condiciones" para estar buscando en Google (tarea xD)

Si les interesa, les dejo dos buenos libros para que lean:
    - You are not allowed to view links. Register or Login --> Documentación
    - You are not allowed to view links. Register or Login

Más libros de Python por You are not allowed to view links. Register or Login

Saludos!
WhiZ
« Última modificación: Mayo 11, 2015, 02:14:06 pm por WhiZ »


Desconectado Barlan

  • *
  • Underc0der
  • Mensajes: 89
  • Actividad:
    0%
  • Reputación 0
  • "The demons of my own design"
    • Ver Perfil
  • Twitter: @BarlanV
« Respuesta #5 en: Mayo 11, 2015, 02:17:33 pm »
You are not allowed to view links. Register or Login
Muy buenos aportes los dos. @WhiZ, muy chulo quedan las UI con Kivy, además por lo que veo es un proyecto FOSS. Me viene muy bien ahora que estoy dándole a Python.

Saludos.

tkinter deja mucho que desear. Pero claro, está mas orientado a proyectos pequeños y personales.
Y por lo que veo, Kivy (cada vez que lo pronuncio me recuerda a una barra de chocolate xD) está más orientado a proyectos de mayor envergadura, al igual que PyQT. Y checando un poco algunas imagenes, puedes hacer cosas bastante hermosas con el  :'( .
« Última modificación: Mayo 11, 2015, 03:01:06 pm por WhiZ »


Desconectado Expermicid

  • *
  • Underc0der
  • Mensajes: 457
  • Actividad:
    0%
  • Reputación 0
  • _-Expermicid-_
    • Ver Perfil
  • Skype: expermicid.xd
« Respuesta #6 en: Mayo 11, 2015, 03:16:53 pm »
Sinceramente recién me entero de kivy xD Le voy a dar una mirada.
Gracias BarlanV por el aporte y a ti WhiZ por la bibliografia.

Saludos

Desconectado Achraf

  • *
  • Underc0der
  • Mensajes: 18
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil
    • Email
  • Skype: achrafon4
  • Twitter: Achrafhmi
« Respuesta #7 en: Mayo 19, 2015, 04:45:59 pm »
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
Muy buenos aportes los dos. @You are not allowed to view links. Register or Login, muy chulo quedan las UI con Kivy, además por lo que veo es un proyecto FOSS. Me viene muy bien ahora que estoy dándole a Python.

Saludos.

tkinter deja mucho que desear. Pero claro, está mas orientado a proyectos pequeños y personales.
Y por lo que veo, Kivy (cada vez que lo pronuncio me recuerda a una barra de chocolate xD) está más orientado a proyectos de mayor envergadura, al igual que PyQT. Y checando un poco algunas imagenes, puedes hacer cosas bastante hermosas con el  :'( .

Barlan, no solo es multiplataforma sino que es muy sencillo y relativamente potente. Si lo combinas con PyGame se pueden hacer juegos para Android :)

 

¿Te gustó el post? COMPARTILO!



Cifrado Compresor [Archivos]

Iniciado por Azav

Respuestas: 8
Vistas: 1689
Último mensaje Enero 30, 2015, 04:00:56 am
por Once
Cifrado julio cesar

Iniciado por blozzter

Respuestas: 0
Vistas: 1531
Último mensaje Mayo 26, 2011, 01:53:13 am
por blozzter
Cifrado rot13 y atbash

Iniciado por Once

Respuestas: 3
Vistas: 2697
Último mensaje Abril 23, 2013, 08:47:19 pm
por k0ws
Cifrado Escitala

Iniciado por Sanko

Respuestas: 0
Vistas: 1432
Último mensaje Agosto 26, 2013, 09:10:24 pm
por Sanko
Cifrado L213

Iniciado por Sanko

Respuestas: 0
Vistas: 996
Último mensaje Febrero 05, 2014, 07:11:22 pm
por Sanko