[TPC-C] #2 Cifrado de Vigenère

  • 13 Respuestas
  • 6175 Vistas

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

Desconectado WhiZ

  • *
  • Ex-Staff
  • *****
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil

[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 16, 2014, 12:38:48 pm
The Python Challenges
Nº 2 Cifrado de Vigenére
Criptografía



Objetivo:


Programar las funciones necesarias que permitan codificar y decodificar un mensaje usando el Cifrado de Vigenére, teniendo en cuenta los siguientes aspectos:

  • La salida debe ser en minúsculas.
  • Se deben respetar los caracteres no alfabéticos.
  • No se tiene en cuenta la letra ñ.


La fecha máxima de entrega es para el Domingo 23 de Febrero. Los códigos deben ser enviados por mp al moderador de la sección (You are not allowed to view links. Register or Login)  y a You are not allowed to view links. Register or Login.

Los criterios de evaluación son los mismos establecidos en You are not allowed to view links. Register or Login.

Sólo se tendrá en cuenta el último código recibido hasta el 23 de Febrero. Los códigos no deben ser publicados bajo ninguna circunstancia; de lo contrario, el usuario será descalificado del reto, sin excepción.


Enlaces de ayuda:

You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login
You are not allowed to view links. Register or Login


Nota: Todas las dudas acerca del reto, deberán realizarse en este mismo hilo.
« Última modificación: Febrero 16, 2014, 01:15:36 pm por 11Sep »


Desconectado deni_celine

  • *
  • Underc0der
  • Mensajes: 36
  • Actividad:
    0%
  • Reputación 0
  • un susurro con la fuerza de mil gritos
    • Ver Perfil

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 17, 2014, 04:01:29 pm
Holaaaa , tengo una duda respecto a este reto, o mejor dicho respecto a los criterios de evaluación :3
uno de los puntos dice : "Número de librerías utilizadas: será mejor la calificación mientras menos librerías se requieran para cumplir el o los objetivos."
Pero en enlaces de ayuda hacen mensión a Itertools , que es mejor evaluado, hacer uso de la libreria o no hacerlo ?

Saludos :P

Desconectado Once

  • *
  • Ex-Staff
  • *****
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
  • Twitter: @don_once
    • Ver Perfil
    • El blog de Once

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 17, 2014, 05:36:32 pm
You are not allowed to view links. Register or Login
Holaaaa , tengo una duda respecto a este reto, o mejor dicho respecto a los criterios de evaluación :3
uno de los puntos dice : "Número de librerías utilizadas: será mejor la calificación mientras menos librerías se requieran para cumplir el o los objetivos."
Pero en enlaces de ayuda hacen mensión a Itertools , que es mejor evaluado, hacer uso de la libreria o no hacerlo ?

Saludos :P

Aprovechando tu pregunta e intentando responder a un mp que merecibí preguntando algo similar, intentaré explicar como evaluamos los codes.

La calificación es así:

Se separan los códigos que cumplen las condiciones y lo que no las cumplen.

Si más de un código cumple todas las condiciones se evalua la velocidad de ejecución de los scripts. Si empatan o los tiempos de ejecución.

Si los tiempos de ejecución son muy cercanos, se declara empate y pasamos a evaluar los criterios que mencionamos en el prime post.

Con respecto a tu pregunta, tienes que pensar si vale la pena codear toda un función entera y depronto sacrificar algo de tiempo (a veces puedes codear funciones más rápidas) o simplemente usar una libreria.

Lo que no calificamos es la longitud del código, así los participantes son libres de tener en cuenta todos los aspectos y no se tienen que preocupar por hacer "maromas" para tener el código más corto (para eso tenemos los retos relámpago).

En los retos relámpago, la única regla es que se cumplan TODOS los requisitos que se piden para cada reto en especial. (No se tiene en cuenta la evaluación de arriba).

Saludos!






You are not allowed to view links. Register or Login

Desconectado deni_celine

  • *
  • Underc0der
  • Mensajes: 36
  • Actividad:
    0%
  • Reputación 0
  • un susurro con la fuerza de mil gritos
    • Ver Perfil

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 17, 2014, 05:57:24 pm
ahora lo entiendo todo xd ya envíe mi code!

Desconectado WhiZ

  • *
  • Ex-Staff
  • *****
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 17, 2014, 09:48:18 pm
Quería comentarles que existe la posibilidad de evitar el uso de librerías externas por medio de yield.

Para aquellos que no conocen este statement, les explico un poco en qué consiste y cómo se utiliza. Con ello espero que deduzcan porqué adquiere importancia en este reto.

En términos generales (muy generales :P) podemos decir que yield es similar a return. El tema es que, a diferencia de return, al utilizar yield dentro de un bucle (y de una función/método, por supuesto) el proceso de iteración no es interrumpido, lo que nos permite obtener más de un valor del bucle. Es decir, un bucle con return nos devuelve un único valor e interrumpe la iteración, mientras que yield nos permite devolver más de un valor debido a que no interrumpe la iteración.

Algunos se estarán preguntando de qué forma se devuelven los valores retornados por yield. Bueno, aquí existe otra diferencia con return. Mientras que return nos permite realizar lo que conocemos como asignación (almacenamiento de un valor en una variable), yield nos crea un objeto de tipo "generator". Estos objetos presentan un método llamado "next()" que nos devuelve uno por uno los valores que el objeto ha almacenado.

Veamos un ejemplo para entenderlo mejor. Primero crearemos 2 funciones (serán similares, salvo por el hecho que en la segunda reemplazaremos el return por el yield) y luego veremos qué sucede al utilizarlas.

Código: Python
  1. # Función con return
  2. def funcReturn(i):
  3.     while i < 10:
  4.         if i%2 == 0:
  5.             return i
  6.         i += 1
  7.     print "Hemos llegado hasta", i
  8.  
  9. # Función con yield
  10. def funcYield(i):
  11.     while i < 10:
  12.         if i%2 == 0:
  13.             yield i
  14.         i += 1
  15.     print "Hemos llegado hasta", i
  16.  

Ahora veamos que sucede al utilizarlas:

Código: Python
  1. >>> r = funcReturn(0)    # Asignamos a la variable "r" el valor devuelto por funcReturn()
  2. >>> y = funcYield(0)    # Creamos un objeto "y" que almacenará los valores devueltos por funcYield()
  3. >>> type(r)    # Verificamos la asignación
  4. <type 'int'>
  5. >>> type(y)    # Verificamos la creación del objeto tipo "generator"
  6. <type 'generator'>
  7. >>>
  8.  
  9. # Como "r" es una variable de tipo "int", podemos ver su valor con un simple print
  10. >>> print r
  11. 0
  12. >>>
  13.  
  14. # Como "y" es un objeto, print no nos sirve para ver los valores que ha almacenado
  15. >>> print y
  16. <generator object funcYield at 0xb5f71f2c>
  17. >>>
  18.  
  19. # Para ver los valores contenidos por "y", deberemos utilizar su método next()
  20. >>> while True:
  21.    try:
  22.       print y.next()
  23.    except StopIteration:
  24.       break
  25.  
  26.    
  27. 0
  28. 2
  29. 4
  30. 6
  31. 8
  32. Hemos llegado hasta 10
  33. >>>
  34.  

Bueno, espero haber sido claro y, lo que es más importante, que les sea de utilidad.

A continuación les dejo un link para que los interesados leer un poco más: You are not allowed to view links. Register or Login

Saludos!
WhiZ


Desconectado WhiZ

  • *
  • Ex-Staff
  • *****
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 17, 2014, 10:25:29 pm
Ahora algunas generalidades del cifrado de Vigenère. Como algunos habrán leído por ahí, este cifrado corresponde (al igual que el cifrado César) a los de tipo simétrico, es decir que utiliza la misma clave tanto para cifrar como para descifrar. La diferencia radica en el tipo de clave y la forma en que esta se aplica sobre el mensaje a cifrar/descifrar.

Código: Text
  1. Cifrado César:
  2. --------------
  3.    - Clave numérica.
  4.  
  5.    - A cada carácter del mensaje a cifrar/descifrar se le suma/resta el valor numérico de la clave (cifrado por desplazamiento).
  6.  
  7. Ejemplo (basado en ascii):
  8.     clave = 4
  9.     mensaje = "abcd"
  10.     cifrado = "efgh"
  11.    
  12.     a (97) + 4 = e (101)
  13.     b (98) + 4 = f (102)
  14.     c (99) + 4 = g (103)
  15.     d (100) + 4 = h( 104)
  16.  
  17. Cifrado de Vigenère:
  18. --------------------
  19.     - Clave alfanumérica.
  20.  
  21.     - A cada carácter del mensaje a cifrar/descifrar se le suma el valor numérico correspondiente a un carácter de la palabra clave. Al carácter siguiente del mensaje se le suma el valor correspondiente al siguiente carácter de la palabra clave. En caso de que el mensaje sea más largo que la palabra clave, esta última será reutilizada las veces que sea necesario, hasta codificar el mensaje por completo.
  22.  
  23. Ejemplo (basado en ascii):
  24.     clave = "reto"
  25.     mensaje = "abcd"
  26.     cifrado = "kyok"
  27.  
  28.     a (97) + r (114) = 211 --> k (107)
  29.     b (98) + e (101) = 199 --> y (121)
  30.     c (99) + t (116) = 215 --> o (111)
  31.     d (100) + o (111) = 211 --> k (107)
  32.  
  33. En este ejemplo, la longitud de la clave coincide con la del mensaje. Si el mensaje fuera más largo, luego de utilizar el último carácter de la clave, continuaremos con el primero.
  34.  

Espero que les sirva!

Saludos!
WhiZ


Desconectado Snifer

  • *
  • Ex-Staff
  • *****
  • Mensajes: 1439
  • Actividad:
    0%
  • Reputación 1
  • [email protected]'s
  • Twitter: sniferl4bs
    • Ver Perfil
    • Snifer@L4bs

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 18, 2014, 04:27:58 pm
Hoy codeo algo y mando por simple idea de practicar y juegar :P

Regards,
Snifer
You are not allowed to view links. Register or Login


Llaman traidor a la persona que evito que caiga el foro, gente bruta!



Desconectado WhiZ

  • *
  • Ex-Staff
  • *****
  • Mensajes: 395
  • Actividad:
    0%
  • Reputación 0
    • Ver Perfil

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 18, 2014, 07:48:40 pm
Excelente! Todo código será bienvenido, por supuesto! Esto lo digo también para aquellos que no han llegado a la inscripción pero que quieran "participar".

Para la próxima , directamente publicaremos el reto y la fecha límite de entrega, sin inscripción previa, de manera tal que aquellos que todos puedan participar.

Saludos!
WhiZ
« Última modificación: Febrero 18, 2014, 07:56:52 pm por WhiZ »


Conectado 79137913

  • *
  • Co Admin
  • Mensajes: 692
  • Actividad:
    6.67%
  • Reputación 16
  • 4 Esquinas
  • Skype: [email protected]
    • Ver Perfil
    • Doors.Party
    • Email

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 20, 2014, 11:43:05 am
HOLA!!!

Codigo enviado.

Código: Python
  1. for x in-2,2:print" 3 1 9R7u3l1e9z7"[::x]

GRACIAS POR LEER!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scouts Team*                                                   You are not allowed to view links. Register or Login

Desconectado Once

  • *
  • Ex-Staff
  • *****
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
  • Twitter: @don_once
    • Ver Perfil
    • El blog de Once

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 24, 2014, 02:20:59 pm
Resultados:

Los códigos se evaluaron usando los siguientes parametos:

Mensaje: Retos python Underc0de.
Clave: undercode

Resultado: lrwsj rmwlia xrugff0hy.

11Sep

Código: Python
  1. def iter_key(s):
  2.     i = 0
  3.     while True:
  4.         yield s[i % len(s)]
  5.         i += 1
  6.    
  7. def vigenere(key, msg, cipher=1):
  8.     key = iter_key(key.lower())
  9.     msg = msg.lower()
  10.    
  11.     buffer = ""
  12.    
  13.     if cipher:
  14.         for byte in msg:
  15.             if "a" < byte < "z":
  16.                 buffer += chr((((ord(byte) - 97) + (ord(key.next()) - 97)) % 26) + 97)
  17.             else:
  18.                 buffer += byte
  19.     else:
  20.         for byte in msg:
  21.             if "a" < byte < "z":
  22.                 buffer += chr((((ord(byte) - 97) - (ord(key.next()) - 97)) % 26) + 97)
  23.             else:
  24.                 buffer += byte
  25.  
  26.     return buffer
  27.  
  28.  
  29. print vigenere("undercode", "Retos python Underc0de.", cipher=True)

Salida: lrwsj rmwlia xrugff0hy.

No cumplen las condiciones:

Sanko

Código: Python
  1. def vigenere(s, k, z=True):
  2.         tchr,tord = chr,ord
  3.  
  4.         if z:
  5.                 print [tchr((tord(x[0]) + tord(x[1])) % 256) for x in zip(s, k)]
  6.         else:
  7.                 print [tchr((tord(x[0]) - tord(x[1])) % 256) for x in zip(s, k)]
  8.  

Salida: ['\xc7', '\xd3', '\xd8', '\xd4', '\xe5', '\x83', '\xdf', '\xdd', '\xd9']

deni_celine

Código: Python
  1. class Vigenere:
  2.     '''Clase que permite codificar y decodificar msj haciendo uso del  Cifrado vigenEre '''
  3.    
  4.     def __init__(self,valor="undercode"):
  5.         '''Inicializa la clase y la clave'''
  6.         self.k=valor
  7.    
  8.     def codificar(self,msj):
  9.         '''Retorna el mensaje cifrado'''
  10.         key=''.join([self.k[i%len(self.k)]for i in range(len(msj))])
  11.         return ''.join([chr(97+(ord(msj[i])+ord(key[i])-194)%26)if(123>ord(msj[i])>96)else msj[i]for i in range(len(msj))])
  12.    
  13.    
  14.     def decodificar(self,msj):
  15.         '''Retorna el mensaje decodificado'''
  16.         key=''.join([self.k[i%len(self.k)]for i in range(len(msj))])
  17.         return ''.join([chr(97+(ord(msj[i])-ord(key[i])+26)%26)if(123>ord(msj[i])>96)else msj[i]for i in range(len(msj))])
  18.    
  19. # fin clase
  20.  
  21. #ejemplo de uso
  22. vigenere = Vigenere("undercode")
  23.  
  24. msj = "Retos python Underc0de."
  25. codificado = vigenere.codificar(msj)
  26. print "Msj codificado :", codificado
  27. print "Msj decodifica :",vigenere.decodificar(codificado)

Salida: Rrwsj dbxbbq Uprhvw0gi.

79137913

Código: Python
  1. def vigenere(a, b):
  2.     d = []
  3.     h = 0
  4.     g = ""
  5.     for c in b.lower():
  6.         d.append(ord(c)-97)
  7.     e = len(d)
  8.     for c in a.lower():
  9.         f = ord(c)
  10.         if f < 97 or f > 122:
  11.             g = g + c
  12.         else:
  13.             f = f + d[h]
  14.             h = h + 1
  15.             if h == e:
  16.                 h = 0
  17.             if f > 122:
  18.                 f = f - 26
  19.             g = g + chr(f)
  20.     return g

Salida: lrwsj rmwlia xrugff0hy.
Nota: Cifra correctamente el mensaje, pero no lo descifra


Ganador:
Sin ganadores.


Saludos!
« Última modificación: Febrero 24, 2014, 07:44:24 pm por 11Sep »






You are not allowed to view links. Register or Login

Desconectado Sanko

  • *
  • Underc0der
  • Mensajes: 541
  • Actividad:
    0%
  • Reputación 0
  • ¿Puedes?
    • Ver Perfil
    • Underc0de

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 24, 2014, 07:05:45 pm
Citar
Se deben respetar los caracteres no alfabéticos.
No se supone que el algoritmo debía tener en cuenta cualquier tipo de resultado? es decir, si se contempla el uso de carácteres no-alfabéticos todo el resultado cambia, pero la implementación del algoritmo sigue siendo válida, no porque no obtengan una misma salida quiere decir que el cifrado en sí este mal.

En mi opinión mi única sugerencia hacia los retos que se proponen es que sean más claros a la hora de publicarlos y que a ser posible cuando se envien los scripts junto con alguna duda, esta pueda ser respondida...

Saludos.
Sigueme en Twitter : @Sankosk
Estos nuevos staff no tienen puta idea XD

Desconectado Once

  • *
  • Ex-Staff
  • *****
  • Mensajes: 391
  • Actividad:
    0%
  • Reputación 0
  • Twitter: @don_once
    • Ver Perfil
    • El blog de Once

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 24, 2014, 08:30:56 pm
You are not allowed to view links. Register or Login
Citar
Se deben respetar los caracteres no alfabéticos.
No se supone que el algoritmo debía tener en cuenta cualquier tipo de resultado? es decir, si se contempla el uso de carácteres no-alfabéticos todo el resultado cambia

Se suponía que se deben respetar los caracteres no alfabéticos y no se tiene en cuenta la letra ñ lo que significa que si hay un caracter que no es alfabético ese caracter simplemente no se cifra.

La única forma que el resultado cambie es si se cambian las letras del alfabeto de posición o si se agrega la ñ

You are not allowed to view links. Register or Login
pero la implementación del algoritmo sigue siendo válida, no porque no obtengan una misma salida quiere decir que el cifrado en sí este mal.

El hecho que hagas un par de sumas y un módulo no significa que la implementación está bien. Lee de nuevo como funciona el cifrado Vigenere y verás que tu código no es un Vigenere.

Y sí, si las salidas no son las mismas cuando cuando la clave y el mensaje son los mismos, significa que el cifrado está mal.

You are not allowed to view links. Register or Login
En mi opinión mi única sugerencia hacia los retos que se proponen es que sean más claros a la hora de publicarlos

Eso es un hecho, para los próximos retos intentaremos ser lo más claros posibles.

You are not allowed to view links. Register or Login
y que a ser posible cuando se envien los scripts junto con alguna duda, esta pueda ser respondida...

You are not allowed to view links. Register or Login
Nota: Todas las dudas acerca del reto, deberán realizarse en este mismo hilo.






You are not allowed to view links. Register or Login

Desconectado deni_celine

  • *
  • Underc0der
  • Mensajes: 36
  • Actividad:
    0%
  • Reputación 0
  • un susurro con la fuerza de mil gritos
    • Ver Perfil

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 24, 2014, 09:20:11 pm
q mal q nadie gano :c , para la otra! el code publicado tampoco descifra bien y no esta contemplando la "a" ni la "z" , dijo el picado xD

Conectado 79137913

  • *
  • Co Admin
  • Mensajes: 692
  • Actividad:
    6.67%
  • Reputación 16
  • 4 Esquinas
  • Skype: [email protected]
    • Ver Perfil
    • Doors.Party
    • Email

Re:[TPC-C] #2 Cifrado de Vigenère

  • en: Febrero 25, 2014, 01:39:37 am
HOLA!!!

Que lastima, no lei bien la consigna, no hubiese sido problema que descifrara...

GRACIAS POR LEER!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scouts Team*                                                   You are not allowed to view links. Register or Login

 

Cifrado Cesar ... 3 Funciones

Iniciado por darkucla

Respuestas: 3
Vistas: 442
Último mensaje Enero 16, 2020, 12:42:18 am
por darkucla
Cifrado julio cesar

Iniciado por blozzter

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

Iniciado por Once

Respuestas: 3
Vistas: 4655
Último mensaje Abril 23, 2013, 08:47:19 pm
por k0ws
Cifrado Compresor [Archivos]

Iniciado por Azav

Respuestas: 8
Vistas: 4004
Último mensaje Enero 30, 2015, 04:00:56 am
por Once
Cifrado Morse

Iniciado por Sanko

Respuestas: 6
Vistas: 5330
Último mensaje Septiembre 08, 2013, 12:55:17 am
por arthusu