Pythonを使用したOpenSSLPHPライブラリからの復号化
MySQLデータベースデータが公開鍵を使用して暗号化され、秘密鍵のみを使用して復号化できるRSA暗号化スキームを実装しています。
PHPのopensslライブラリを使用して暗号化と復号化を行うことができ、秘密鍵を保護するためにパスフレーズを追加することもできました。
// $sRawText is the text string to encrypt.
// $sPublicKey is the public key stored on the server.
openssl_public_encrypt($sRawText, $sResult, $sPublicKey, OPENSSL_PKCS1_OAEP_PADDING);
// $sResult is the encrypted result which can then be stored in the database.
これは、ユーザーがサインアップした場合に新しいエントリを追加したり、将来的にログインした場合に詳細を確認したりするなど、公開する必要があるすべての目的に最適です。これは連絡先情報などの機密データです。私はたまにしか使用しません。パスワードのようにのみ検証されるデータは引き続きハッシュでき、読み取る必要のあるものは暗号化されません。
現在PHPで復号化している方法は次のとおりです。
// $sPrivateKey is the matching private key.
// $sPassPhrase is the pass phrase (required to decrypt the result).
// $sRawBytes is the encrypted data from the database to decrypt.
$kRsaKey = openssl_pkey_get_private($sPrivateKey, $sPassPhrase);
openssl_private_decrypt($sRawBytes, $sResult, $kRsaKey, OPENSSL_PKCS1_OAEP_PADDING);
// $sResult will be the decrypted data.
この復号化アプローチの問題は、すべてがサーバー上でライブで行われていることです。明らかに、そのサーバーに秘密鍵を保存すると、サーバーへの十分なアクセス権を持っている人なら誰でも簡単にそれを利用できるため、セキュリティ上の利点のほとんどが無効になります。サーバーでPHPを使用することを思いつくのに最適なのは、復号化のたびに秘密鍵を渡すか、フレーズを渡すことです。ただし、それでもキーはそこに存在し、キーとパスフレーズがそれらのリクエストで傍受されるための新しい攻撃手段を開きます。
私がやろうとしているのは、すべての復号化をオフラインで実行することです。そのため、オフラインソフトウェアには、暗号化されたデータがテキストファイルで提供され、データと目的の操作に基づいて命令のリストに変換されます。秘密鍵がその隔離された環境を離れることはなく、パスフレーズがセッション間で保存されることもありません。
オフラインのPHP環境をセットアップする際にさまざまなハードルに直面しているので、Pythonで復号化を試みる方が簡単かもしれないと思いました。すべてが標準である必要があるか、そう思いました。
現在、PythonRSAライブラリをここで使用しようとしています。
https://stuvel.eu/python-rsa-doc/reference.html#exceptions < / p>
私が理解できないのは、パスフレーズで保護された秘密鍵を使用して復号化する方法です。誰もが本当に簡単な例を投稿できるでしょうか、それともPython RSAライブラリに大幅な変更を加えないと基本的に互換性がありませんか?この復号化をオフラインで実行できるようにするための最も簡単なアプローチは何ですか?
答え :
解決策:
わかりましたので、答えを投稿します。
(1)Pythonで暗号化ライブラリを取得する必要があります。
Windowsでは、コマンドプロンプトに入力します(Pythonインタープリターではありません):
py -m pip install cryptography
上記が機能しない場合は、「py」を「python」に置き換えてみてください。
(2)秘密鍵はテキストファイル「privatekey.txt」に含まれている必要があります。
(3)復号化に次のコードを使用します:
from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.primitives.asymmetric import padding
#privatekey.txt must contain the private key.
#passphrase_bytes must be the passphrase, and it needs to be in bytes (ie b'My Pass Phrase')
with open("privatekey.txt", "rb") as key_file:
private_key = serialization.load_pem_private_key(
key_file.read(),
password=passphrase_bytes,
)
#rawtext_bytes must have the bytes of the ciphertext to decrypt
plaintext = private_key.decrypt(
rawtext_bytes,
padding.OAEP(
mgf=padding.MGF1(algorithm=hashes.SHA1()),
algorithm=hashes.SHA1(),
label=None
)
)
#plaintext will now contain the result
同様の質問
私たちのウェブサイトで同様の質問で答えを見つけてください。