2012-06-21 48 views
13

Estoy usando Python 2.7. Tengo una cadena alfanumérica, en la que quiero realizar un cifrado/descifrado. Cualquier cosa que haga debería seguir siendo bidireccional y el resultado también debería ser alfanumérico.Python: Cifrado alfanumérico bidireccional

Por ejemplo:

str = 'ma6546fbd' 
encrypted_data = encrypt_function(str) 
decrypted_data = decrypt_function(encrypted_data) 
print decrypted_data # I get 'ma6546fbd' 

¿Qué he hecho:

me han escrito una función

def xor_crypt_string(data, key): 
    return ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(data, cycle(key))) 

Este toma los datos y una clave y devuelve el resultado, el El problema es que también incluye caracteres especiales, que quiero evitar.

+2

¿Tiene una buena razón para inventar su propia encriptación? –

+2

Apenas lo está inventando, es solo un XOR – mhawke

+0

He intentado algunos de los mecanismos como ASE, etc. pero también consigo caracteres especiales. Como dije, quiero una cadena alfanumérica que se enviará al usuario como json obj. Y el código anterior es una simple operación de Xor –

Respuesta

33

Si desea un cifrado serio (leer irrompible), entonces usaría AES desde pycrypto algo así.

>>> from Crypto.Cipher import AES 
>>> from Crypto import Random 
>>> key = b'Sixteen byte key' 
>>> iv = Random.new().read(AES.block_size) 
>>> cipher = AES.new(key, AES.MODE_CFB, iv) 
>>> msg = iv + cipher.encrypt(b'Attack at dawn') 
>>> msg.encode("hex") 
'e10e096aabff9db382abe8d704404995a7b64d72a4e1b9e5208912d206c4' 

Ese es su mensaje ascii. Ahora decodificar el mensaje como este

>>> recv='e10e096aabff9db382abe8d704404995a7b64d72a4e1b9e5208912d206c4' 
>>> cipher.decrypt(recv.decode("hex"))[len(iv):] 
'Attack at dawn' 
>>> 

Cualquier método de cifrado de hacer usted mismo será fácil de romper por un experto y el que has mostrado anteriormente entra en esa categoría.

+0

. Creo que el cifrado XOR con una clave aleatoria es irrompible. El problema es la gestión de claves. ¿No seguirías teniendo el mismo problema con AES? – mhawke

+0

+1 Después de una rápida reeducación, lo que dije probablemente sea cierto, pero la administración de claves con encriptación XOR es bastante más difícil y difícil de manejar que para AES. XOR también es vulnerable a ataques conocidos de texto plano. – mhawke

+4

Si usa la llave una sola vez, entonces una clave diferente para cada mensaje es correcta. Esta es una almohadilla de una sola vez. Sin embargo, las almohadillas de una sola vez son realmente inconvenientes, ya que tendrá que almacenar tanta información clave como un mensaje, ¡y eso debe acordarse con el remitente y el receptor con anticipación! Con AES puede usar la misma clave para cada mensaje y estar seguro (con fines prácticos) de que nadie puede descifrar sus mensajes sin la clave. –

2

¿Cuán estricto es el requisito alfanumérico?

¿Qué hay de la codificación base64 el resultado de su función de cifrado existente? Puede terminar con algunos caracteres de relleno "=", pero puede recortarlos, calcular y manejar el relleno extra.

def xor_crypt_string(plaintext, key): 
    ciphertext = ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(plaintext, cycle(key))) 
    return ciphertext.encode('base64') 

def xor_decrypt_string(ciphertext, key): 
    ciphertext = ciphertext.decode('base64') 
    return ''.join(chr(ord(x)^ord(y)) for (x,y) in izip(ciphertext, cycle(key))) 
+0

O, como sugiere otra respuesta, podría usar codificación hexadecimal en lugar de base64. – mhawke

+0

Lo cansé, el resultado contiene muchos caracteres especiales. Tengo que enviar esta cadena alfanumérica como json codificada para el usuario. No se puede jugar con los caracteres especiales –

+0

Luego use .encode ('hex') que dará como resultado cadenas que contienen 0-9 y a-f solamente. Deberías considerar seriamente la respuesta de Nick Craig-Wood. – mhawke