domingo, 29 de noviembre de 2015

cryptopy


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.

Cryptography and Python


1>>> from Crypto.Cipher import AES
2>>> aes = AES.new('0123456701234567', AES.MODE_ECB)
3>>> text = 'abcdefghijklmnop'
4>>> cipher_text = aes.encrypt(text)
5>>> cipher_text
6"'\x91\xc4MoJp\xd8M`\xb6?:s\xf0:"
7>>> aes.decrypt(cipher_text)
8'abcdefghijklmnop'

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.

Cryptography and Python

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)
08>>> cipher_text
09'\xca \xfb\n\x18%\xa4\xce\x97\x86\x1d\xbc\xd3\xd7\x9e&'
10>>> aes2.decrypt(cipher_text)
11'abcdefghijklmnop'

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.

Cryptography and Python

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)
5>>> key
6<_RSAobj @0x7f60cf1b57e8 n(1024),e,d,p,q,u,private>

1>>> key.can_encrypt()
2True
3>>> key.can_sign()
4True
5>>> key.has_private()
6True

Cifrar

1>>> public_key = key.publickey()
2>>> enc_data = public_key.encrypt('abcdefgh', 32)
3>>> enc_data
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)
2'abcdefgh'

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)
5>>> text = 'abcdefgh'
6>>> hash = SHA256.new(text).digest()
7>>> hash
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'')

Verificar firma


1>>> text = 'abcdefgh'
2>>> hash = SHA256.new(text).digest()
3>>> public_key.verify(hash, signature)
4True

https://www.dlitz.net/software/pycrypto/api/current/
http://www.laurentluce.com/posts/python-and-cryptography-with-pycrypto/

No hay comentarios:

Publicar un comentario