Cifrado de Vigenère
El cifrado Vigenère es un cifrado basado en diferentes series de caracteres o letras del cifrado César formando
estos caracteres una tabla, llamada tabla de Vigenère, que se usa como clave. El cifrado de Vigenère es un
cifrado polialfabético y de sustitución.
El cifrado Vigenère se ha reinventado muchas veces. El método original fue descrito por Giovan Batista Belaso
en su libro de 1553 La cifra del Sig. Giovan Batista Belaso. Sin embargo, fue incorrectamente atribuido más tarde
a Blaise de Vigenère, concretamente en el siglo XIX, y por ello aún se le conoce como el "cifrado Vigenère".
Este cifrado es conocido porque es fácil de entender e implementar, además parece irresoluble; esto le hizo
valedor del apodo el código indescifrable (le chiffre indéchiffrable, en francés)." wikipedia
aqui el codigo
def codificacion(palabra_clave,mensaje):
mensaje_codificado=" "
mensaje=mensaje.upper()
palabra_clave=palabra_clave.upper()
longitud=len(mensaje)
longitud_clave=len(palabra_clave)
palabra_clave=palabra_clave*int(longitud/longitud_clave+1)
for i in range(longitud):
inicial=palabra_clave[i]
letra_quiero=mensaje[i]
#inicial='Y'
#letra_quiero='P'
mensaje_codificado+=vigerene(inicial,letra_quiero)
return mensaje_codificado.lstrip() #Quita el espacio del comienzo
def vigerene(a1,a2,opcion=0):
#a1 letra de la palabra clave y a2 la letra real
inicial=letra_numero(a1)
letra_quiero=letra_numero(a2)
letras=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
letras1=letras[inicial:]+letras[:inicial]
if opcion==0:
return letras1[letra_quiero]
else:
return letras1
def recuperar_virgerene(palabra_clave,mensaje_codificado):
mensaje_original=" "
letras=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
pocision_original=0
longitud=len(mensaje_codificado)
longitud_clave=len(palabra_clave)
palabra_clave=palabra_clave.upper()*int(longitud/longitud_clave+1)
for i in range(longitud):
inicial=palabra_clave[i]
letra_resultado=mensaje_codificado[i]
letras1=vigerene(inicial,'Z',opcion=1) #pongo uno ya que no tiene importancion
pocision_original=letras1.index(letra_resultado)
mensaje_original+=letras[pocision_original]
return mensaje_original.lstrip() #Quita el espacio del comienzo
def letra_numero(letra):
return ord(letra)-65
def numero_letra(numero):
return chr(numero+65)
def main():
palabra_clave="meliespe"
mensaje=raw_input("Ingrese el mensaje: ")
#mensaje="hola como?"
mensaje_alter=mensaje.split()
mensaje=" "
for i in range(len(mensaje_alter)):
#Signo de puntuacion para ser quitados
mensaje_alter[i]=mensaje_alter[i].rstrip("?")
mensaje_alter[i]=mensaje_alter[i].rstrip(".")
mensaje_alter[i]=mensaje_alter[i].lstrip(".")
mensaje_alter[i]=mensaje_alter[i].rstrip(",")
mensaje_alter[i]=mensaje_alter[i].lstrip(",")
mensaje_alter[i]=mensaje_alter[i].rstrip(":")
mensaje_alter[i]=mensaje_alter[i].lstrip(":")
mensaje_alter[i]=mensaje_alter[i].rstrip('"')
mensaje_alter[i]=mensaje_alter[i].lstrip('"')
mensaje_alter[i]=mensaje_alter[i].rstrip("!")
mensaje_alter[i]=mensaje_alter[i].lstrip("!")
mensaje_alter[i]=mensaje_alter[i].rstrip("$")
mensaje_alter[i]=mensaje_alter[i].lstrip("$")
mensaje+=mensaje_alter[i]
mensaje=mensaje.lstrip()
#Codificacion
print "Mensaje: ",mensaje.upper()
resultado=codificacion(palabra_clave,mensaje)
resultado=resultado.lstrip()
print "resultado: ", resultado
#recuperacion
mensaje_original=recuperar_virgerene(palabra_clave,resultado)
print "Decodificado: ",mensaje_original
print "Correcto?:", mensaje_original==mensaje.upper()
return 0
if __name__ == '__main__':
main()
No esta implementado con la forma matemática sino de una forma manual por así decirlo
la tabla de transformación
14 junio hoy es un gran dia!
ResponderEliminar