Created
October 24, 2012 04:59
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/python | |
import random | |
DEBUG = True | |
###las primeras tres funciones hacen lo mismo pero tienen diferente | |
###nombre para no confundir los pasos | |
def mensaje(): | |
'''Crea el mensaje que se va a cifrar | |
''' | |
bits = 228 | |
mensaje = [] | |
for i in range(bits): | |
mensaje.append(random.randint(0,1)) | |
return mensaje | |
def generaClave(): | |
'''Genera una clave de usuario la que esta | |
almacenada en la SIM de 64 bits | |
''' | |
bits = 64 | |
clave = [] | |
for i in range(bits): | |
clave.append(random.randint(0,1)) | |
return clave | |
def inicializacion(): | |
'''Genera un vector de inicializacion publicamente | |
conocido de 22 bits | |
''' | |
bits = 22 | |
v_init = [] | |
for i in range(bits): | |
v_init.append(random.randint(0,1)) | |
return v_init | |
def registros(): | |
'''Se llenan en 0 los registros | |
''' | |
R1 = [0 for i in range(19)] | |
R2 = [0 for i in range(22)] | |
R3 = [0 for i in range(23)] | |
return R1, R2, R3 | |
def aplica_xor(R1, R2, R3, clave): | |
'''Se aplica xor a los registros | |
''' | |
###Posiciones clave del registro 1 | |
r1_1= 18 | |
r1_2= 17 | |
r1_3= 16 | |
r1_4= 13 | |
###Posiciones clave del registro 2 | |
r2_1= 21 | |
r2_2= 20 | |
###Posiciones clave del registro 3 | |
r3_1= 22 | |
r3_2= 21 | |
r3_3= 20 | |
r3_4= 7 | |
for i in range(len(clave)): | |
R1res = R1[r1_1] ^ R1[r1_2] | |
R1res = R1res ^ R1[r1_3] | |
R1res = R1res ^ R1[r1_4] | |
R1.insert(0, clave[i] ^ R1res) | |
R1.pop() | |
R2res = R2[r2_1] ^ R2[r2_2] | |
R2.insert(0, clave[i] ^ R2res) | |
R2.pop() | |
R3res = R3[r3_1] ^ R3[r3_2] | |
R3res = R3res ^ R3[r3_3] | |
R3res = R3res ^ R3[r3_4] | |
R3.insert(0, clave[i] ^ R3res) | |
R3.pop() | |
return R1, R2, R3 | |
def funcion_mayoria(R1, R2, R3, clave): | |
###Posiciones clave del registro 1 | |
r1_1= 18 | |
r1_2= 17 | |
r1_3= 16 | |
r1_4= 13 | |
###Posiciones clave del registro 2 | |
r2_1= 21 | |
r2_2= 20 | |
###Posiciones clave del registro 3 | |
r3_1= 22 | |
r3_2= 21 | |
r3_3= 20 | |
r3_4= 7 | |
###Bits de reloj | |
c1 = 8 | |
c2 = 10 | |
c3 = 10 | |
###Numeros de ciclos | |
ciclos = 100 | |
uno = 0 | |
dos = 0 | |
for i in range(ciclos): | |
#con esta formula obtenemos F(c1,c2,c3) que nos ayuda a determinar que | |
#registro de desplazara | |
numero = (R1[c1] and R2[c2])^(R1[c1] and R3[c3])^(R2[c2] and R3[c3]) | |
if R1[c1] == numero: | |
R1res = R1[r1_1] ^ R1[r1_2] | |
R1res = R1res ^ R1[r1_3] | |
R1res = R1res ^ R1[r1_4] | |
R1.insert(0, R1res) | |
R1.pop() | |
if R2[c2] == numero: | |
R2res = R2[r2_1] ^ R2[r2_2] | |
R2.insert(0, R2res) | |
R2.pop() | |
if R3[c3] == numero: | |
R3res = R3[r3_1] ^ R3[r3_2] | |
R3res = R3res ^ R3[r3_3] | |
R3res = R3res ^ R3[r3_4] | |
R3.insert(0, R3res) | |
R3.pop() | |
return R1, R2, R3 | |
def clave_cifrado(R1, R2, R3): | |
###Posiciones clave del registro 1 | |
r1_1= 18 | |
r1_2= 17 | |
r1_3= 16 | |
r1_4= 13 | |
###Posiciones clave del registro 2 | |
r2_1= 21 | |
r2_2= 20 | |
###Posiciones clave del registro 3 | |
r3_1= 22 | |
r3_2= 21 | |
r3_3= 20 | |
r3_4= 7 | |
ciclos = 228 | |
clave = [] | |
for i in range(228): | |
R1res = R1[r1_1] ^ R1[r1_2] | |
R1res = R1res ^ R1[r1_3] | |
R1res = R1res ^ R1[r1_4] | |
R1.insert(0, R1res) | |
k1 = R1.pop() | |
R2res = R2[r2_1] ^ R2[r2_2] | |
R2.insert(0, R2res) | |
k2 = R2.pop() | |
R3res = R3[r3_1] ^ R3[r3_2] | |
R3res = R3res ^ R3[r3_3] | |
R3res = R3res ^ R3[r3_4] | |
R3.insert(0, R3res) | |
k3 = R3.pop() | |
clave.append(k1 ^ k2 ^ k3) | |
return R1, R2, R3, clave | |
def cifrar(mensaje, llave): | |
cifrado = [] | |
for i in range(len(mensaje)): | |
cifrado.append(mensaje[i]^llave[i]) | |
return cifrado | |
def main(): | |
#Inicializacion de A5 | |
#Paso 1: los tres registros de desplazamiento se | |
#ajustan en ceros. La salida y la funcion mayoria estan | |
#deshabilitados | |
mensaje_original = mensaje() | |
clave = generaClave() | |
v_init = inicializacion() | |
R1, R2, R3 = registros() | |
#Paso 2: al bit menos significativo de cada registro se aplica X0R | |
#con cada bit de la clave durante 64 ciclos | |
R1, R2, R3 = aplica_xor(R1, R2, R3, clave) | |
#Paso 3: al bit menos significativo de cada registro se aplica XOR | |
#con cada bit del vector de inicializacion durante 22 ciclos | |
R1, R2, R3 = aplica_xor(R1, R2, R3, v_init) | |
#Paso 4: La funcion mayoria F se habilita y durante 100 ciclos se | |
#desplazan los registros | |
R1, R2, R3 = funcion_mayoria(R1, R2, R3, v_init) | |
#Paso 5: Utilizando la funcion mayoria y habilitando la salida, se | |
#desplazan los bits de cada registro durante 228 ciclos. Los bits mas | |
#significativos de cada rehistro se operan con XOR y se crea un bit de | |
#cifrado en cada iteracion | |
R1, R2, R3, cl = clave_cifrado(R1, R2, R3) | |
#Cifrado del mensaje | |
mensaje_cifrado = cifrar(mensaje_original, cl) | |
if DEBUG: | |
print "*******************************" | |
print "La clave de usuario es: " | |
print clave | |
print "*******************************" | |
print "El vector de inicializacion es: " | |
print v_init | |
print "*******************************" | |
print "El mensaje original es:" | |
m = ''.join(str(e) for e in mensaje_original) | |
print m | |
print "*******************************" | |
print "El mensaje cifrado es:" | |
m2 = ''.join(str(e) for e in mensaje_cifrado) | |
print m2 | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment