RSA кодирование на Python

В PHP есть замечательные функции для облегчения кодирования информации. Одна из них openssl_seal, которая кодирует данные используя RC4 со случайно сгенеренным секретным ключом. В Python такой функции нету. Но можно воспользоваться пакетом M2Crypto для написания своей собственной.

Если у вас имеется PEM закодированный x509 сертификат, то вам нужно получить из него публичный ключ. Это можно сделать следующей коммандой:

openssl x509 -inform pem -in mycert.pem -pubkey -noout > publickey.pem

где mycert.pem - файл x509 сертификата.

Если ваш PEM закодированный x509 сертификат в виде строки, то получить публичный код из него можно следующими коммандами:

import M2Crypto
cert = M2Crypto.X509.load_cert_string(cert_string)
pubkey = cert.get_pubkey().get_rsa()

После того, как вы получили публичный ключ, его можно импортировать для работы с M2Crypto с помощью метода load_pub_key().

import M2Crypto
import M2Crypto.Rand
import M2Crypto.RSA
import base64

public_key = "publickey.pem"
message = "Text for encryption"

# Load public key from file
pubkey = M2Crypto.RSA.load_pub_key(public_key)
# Generate sected key
randdata = M2Crypto.Rand.rand_bytes(16)
# Get envelope key
env_key = pubkey.public_encrypt(randdata, M2Crypto.RSA.pkcs1_padding)
print base64.b64encode(env_key)

# Encode data
cipher='rc4'
iv = ""
enc = M2Crypto.EVP.Cipher(cipher, randdata, iv, M2Crypto.encrypt)
data = enc.update(message)
data += enc.final()
print base64.b64encode(data)

В результате мы имеем base64 кодированную обертку и base64 кодированные данные.

Так же при кодировании может понадобиться подписать данные приватным ключем. Это так же можно сделать с помощью пакета M2Crypto:

import M2Crypto.RSA
import M2Crypto.EVP
import base64
import hashlib

private_key = 'privatekey.pem'
message = "Text for encryption"

key = M2Crypto.RSA.load_key(private_key)
pkey = M2Crypto.EVP.PKey()
pkey.assign_rsa(key)
rsa = pkey.get_rsa()
digest = hashlib.sha1(message).digest()
sign = rsa.sign(digest)
print base64.b64encode(sign)

В результате мы имеем base64 кодированную подпись.

 
comments powered by Disqus