openssl_seal () в Python - PullRequest
       14

openssl_seal () в Python

6 голосов
/ 04 мая 2010

Чтобы подключиться к серверу, я обнаружил, что при использовании PHP мне нужно использовать openssl_seal(). Это нормально, но я хочу использовать Python. Я не могу преобразовать openssl_seal() в эквивалентную функцию.

Можете ли вы помочь мне?

Вот что openssl_seal() делает:

Описание int openssl_seal (строка $ data, строка & $ sealed_data, массив & $ env_keys, массив $ pub_key_ids)

openssl_seal() seals (encrypts) data by using RC4 with a randomly generated
secret key. The key is encrypted with each of the public keys associated
with the identifiers in pub_key_ids and each encrypted key is returned in
env_keys. This means that one can send sealed data to multiple recipients
(provided one has obtained their public keys). Each recipient must receive
both the sealed data and the envelope key that was encrypted with the
recipient's public key.

Ответы [ 2 ]

2 голосов
/ 28 февраля 2013

этот блог имеет очень подробное описание того, что происходит внутри openssl_seal(). У этого также есть реализация в Java.

Исходя из этого, я думаю, что было бы относительно просто («прямое доказательство, оставленное читателю в качестве упражнения») сделать эквивалентную реализацию в python, используя pyopenssl , который включает RC4 или новее, но для этих целей более ориентирован tlslite .

1 голос
/ 01 сентября 2017

Что openssl_seal делает:

  1. Извлечение публичного ключа из сертификата
  2. Генерирует 128-битный (16 байт) ключ random_ (он будет использоваться для шифрования сообщения с использованием симметричного алгоритма, поскольку он быстрее)
  3. Шифровать random_key, используя PKCS # 1
  4. Зашифруйте сообщение, используя ARC4 и random_key
  5. Вывести ключ encrypted_random_key и encrypted_message

Получающая сторона может затем расшифровать ключ encrypted_random_key, используя свой private_key, а затем расшифровать сообщение encrypted_message, используя random_key.

Поскольку в Python нет способа сделать это через стандартную библиотеку, я просто выброшу 3 подхода, которые я опробовал:

# pyca/cryptography (cryptography.io) version
# pip install cryptography

import os

import cryptography
from cryptography import x509


message = 'Super secret secret message'
message = message.encode('utf-8')
certificate_data = open('/path/to/certificate.cer', 'r').read()
certificate_data = certificate_data.encode('utf-8')
certificate = cryptography.x509.load_pem_x509_certificate(data=certificate_data, backend=cryptography.hazmat.backends.default_backend())
public_key = certificate.public_key()
random_key = os.urandom(16)
encrypted_random_key = public_key.encrypt(plaintext=random_key, padding=cryptography.hazmat.primitives.asymmetric.padding.PKCS1v15())
print(encrypted_random_key)
algorithm = cryptography.hazmat.primitives.ciphers.algorithms.ARC4(random_key)
cipher = cryptography.hazmat.primitives.ciphers.Cipher(algorithm=algorithm, mode=None, backend=cryptography.hazmat.backends.default_backend())
encryptor = cipher.encryptor()
encrypted_message = encryptor.update(message)
print(encrypted_message)

.

# M2Crypto version
# pip install pip install git+https://gitlab.com/m2crypto/m2crypto@python3

import M2Crypto


message = 'Super secret secret message'
message = message.encode('utf-8')
certificate = M2Crypto.X509.load_cert('/path/to/certificate.cer')
public_key = certificate.get_pubkey()
rsa_pub = public_key.get_rsa()
random_key = M2Crypto.Rand.rand_bytes(16)
encrypted_random_key = rsa_pub.public_encrypt(random_key, M2Crypto.RSA.pkcs1_padding)
print(encrypted_random_key)
cipher = M2Crypto.EVP.Cipher(alg='rc4', key=random_key, iv=b'', op=M2Crypto.encrypt)
encrypted_message = cipher.update(message)
encrypted_message += cipher.final()
print(encrypted_message)

.

# PyCrypto version
# pip install pycrypto

# Please bear in mind that PyCrypto cannot handle x509 certificates.
# You will have to extract the public_key to a pem file:
# openssl x509 -inform pem -in certificate.cer -pubkey -noout > public_key.pem

from Crypto import Random
from Crypto.Cipher import ARC4
from Crypto.Cipher import PKCS1_OAEP
from Crypto.Cipher import PKCS1_v1_5
from Crypto.PublicKey import RSA


message = 'Super secret secret message'
message = message.encode('utf-8')
public_key_data = open('/path/to/public_key.pem', 'r').read()
public_key = RSA.importKey(public_key_data)
random_key = Random.new().read(16)
cipher = PKCS1_v1_5.new(public_key)
encrypted_random_key = cipher.encrypt(random_key)
print(encrypted_random_key)
cipher = ARC4.new(random_key)
encrypted_message = cipher.encrypt(message)
print(encrypted_message)

Вы можете проверить мой пост на => http://helpfulsheep.com/2017-09-01-openssl-seal-in-python/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...