Расшифровка с использованием открытого ключа в Python

Вопрос задают неоднократно, но я не могу получить работу, поэтому снова публикую. Мне предоставлен общий файл открытого ключа в формате

----- НАЧАТЬ СЕРТИФИКАТ ----- XXXXXXXXXXXXXXXXXXXXXXX ----- КОНЕЦ СЕРТИФИКАТ -----

Используя этот файл, в PHP я могу выполнить расшифровку и получить декодированное сообщение, используя openssl_public_decrypt(), Сейчас я пытаюсь выполнить процесс расшифровки в Python. Я пытался с:

Crypto - gives 'valueerror: rsa key format is not supported' when RSA.importKey() is called.

python-rsa а также M2Crypto тоже не помогло.

За M2Crypto Я ссылался на эту ссылку, но RSA.load_pub_key_bio(bio) строка кода дает ошибку.

Любая помощь очень ценится. Спасибо.

1 ответ

Вы можете сделать это с помощью слоя hazmat библиотеки криптографии (обратите внимание, что криптография теперь является внутренней библиотекой, используемой pyOpenSSL; в то время как pyOpenSSL удобна для некоторых целей, криптография обеспечивает гораздо более полное связывание OpenSSL, а также полезный более высокий уровень (более безопасный). лучше) криптографические примитивы и привязки к другим криптографическим библиотекам). Прежде чем сделать это, обратите внимание, что очень легко выстрелить себе в ногу со слоем hazmat, и криптографическая команда не извинится, если вы это сделаете.

Вы должны быть уверены, что понимаете, что происходит с этими операциями, прежде чем полагаться на код для обеспечения какой-либо безопасности. Кроме того, если вы управляете полным стеком - от шифрования до дешифрования - прекратите делать это таким образом. Вместо этого используйте что-то вроде PGP.

>>> from cryptography.hazmat.backends import default_backend
>>> from cryptography.hazmat.primitives import serialization
>>> with open("key.pem") as key_file:
...     pkey = serialization.load_pem_private_key(key_file.read(), password=None, backend=default_backend())
... 
>>> from cryptography.hazmat.primitives.asymmetric import padding
>>> ciphertext = pkey.public_key().encrypt(b"asdasd", padding.PKCS1v15())
>>> print repr(ciphertext)
'*\xf3\x8e2T\x8f\x93\xae}\x18\x9f7\x00\xbcw\xbd$\x14\x9f6\x9a\xc3\xa1\xa8\xf3\xa5\xcc\xae\x89\x17]\x91\x1d\x85\xb0.\xf7&\x12w\x0ca\x1cN\xd2\x8f\xf5\xf7\xfe\x93\xfbL\x17#\xc6g\x1dj\x84\xc3ET\xd1\x92 \xd2u\xc7AF\xa9<4i`d\xdb\xc0%\xae\x06\xc4\xeeJsC\x06\x80\xc9* \x11\x99P\xdc\xa9S\xad\xe2\xe5L\x9f\x9f\x0c\x04\xef\x95\xd7:*\x06@\r|e\xcdL\xfe9\x80R\x82c\x00\xc0\x9as\xea'
>>> pkey.decrypt(ciphertext, padding.PKCS1v15())
'asdasd'
>>> 
Другие вопросы по тегам