Crytografia con Python
Criptografia Simetrica
Cifradores de Bloque
Cifrador libro de codigo electronico ECB Eelectronic Code Book
Es el método mas fácil de cifrar se cifra un bloque por vez independientemente de los bloques anteriores.
1 | >>> from Crypto.Cipher import AES |
2 | >>> aes = AES.new('0123456701234567', AES.MODE_ECB) |
3 | >>> text = 'abcdefghijklmnop' |
4 | >>> cipher_text = aes.encrypt(text) |
6 | "'\x91\xc4MoJp\xd8M`\xb6?:s\xf0:" |
7 | >>> aes.decrypt(cipher_text) |
Se importa la librería AES
Se inicializa con el código de cifrado y con el método de cifrado y luego se cifra utilizando como entrada la variable 'text'
Cifrado de bloque con realimentación CBF Cipher feedback Block
En este metodo se re-alimenta el cifrador con la salida ya cifrada del paso anterior.
En este caso para la primera vuelta debemos generar un numero aleatorio ya que todavia no tenemos una salida cifrada. Inicializamos la cifra con la clave el metodo de cifrado y la salida anterior.
Para descifrar necesitamos una inicializacion de un 'aes2'
01 | >>> from Crypto.Cipher import AES |
02 | >>> from Crypto import Random |
03 | >>> iv = Random.get_random_bytes(8) |
04 | >>> aes1 = AES.new('0123456701234567', AES.MODE_CFB, iv) |
05 | >>> aes2 = AES.new('0123456701234567', AES.MODE_CFB, iv) |
06 | >>> text = 'abcdefghijklmnop' |
07 | >>> cipher_text = aes1.encrypt(text) |
09 | '\xca \xfb\n\x18%\xa4\xce\x97\x86\x1d\xbc\xd3\xd7\x9e&' |
10 | >>> aes2.decrypt(cipher_text) |
Criptografia Asimétrica
La cryptografia asimetrica requiere de un par de claves una para cifrar y otra para descifrar a este par de claves las llamaremos public y privada.
Generar par de claves
1 | >>> from Crypto.PublicKey import RSA |
2 | >>> from Crypto import Random |
3 | >>> random_generator = Random.new().read |
4 | >>> key = RSA.generate(1024, random_generator) |
6 | <_RSAobj @0x7f60cf1b57e8 n(1024),e,d,p,q,u,private> |
Cifrar
1 | >>> public_key = key.publickey() |
2 | >>> enc_data = public_key.encrypt('abcdefgh', 32) |
4 | ('\x11\x86\x8b\xfa\x82\xdf\xe3sN ~@\xdbP\x85 |
5 | \x93\xe6\xb9\xe9\x95I\xa7\xadQ\x08\xe5\xc8$9\x81K\xa0\xb5\xee\x1e\xb5r |
6 | \x9bH)\xd8\xeb\x03\xf3\x86\xb5\x03\xfd\x97\xe6%\x9e\xf7\x11=\xa1Y<\xdc |
7 | \x94\xf0\x7f7@\x9c\x02suc\xcc\xc2j\x0c\xce\x92\x8d\xdc\x00uL\xd6. |
8 | \x84~/\xed\xd7\xc5\xbe\xd2\x98\xec\xe4\xda\xd1L\rM`\x88\x13V\xe1M\n X |
9 | \xce\x13 \xaf\x10|\x80\x0e\x14\xbc\x14\x1ec\xf6Rs\xbb\x93\x06\xbe',) |
Descifrar
1 | >>> key.decrypt(enc_data) |
Firmar
1 | >>> from Crypto.Hash import SHA256 |
2 | >>> from Crypto.PublicKey import RSA |
3 | >>> from Crypto import Random |
4 | >>> key = RSA.generate(1024, random_generator) |
6 | >>> hash = SHA256.new(text).digest() |
8 | '\x9cV\xccQ\xb3t\xc3\xba\x18\x92\x10\xd5\xb6\xd4\xbfWy\r5\x1c\x96\xc4|\x02\x19\x0e\xcf\x1eC\x065\xab' |
9 | >>> signature = key.sign(hash, '') |
2 | >>> hash = SHA256.new(text).digest() |
3 | >>> public_key.verify(hash, signature) |
https://www.dlitz.net/software/pycrypto/api/current/
http://www.laurentluce.com/posts/python-and-cryptography-with-pycrypto/