PythonでPGPを実行する方法(キーの生成、暗号化/復号化)
-
06-07-2019 - |
質問
インストーラーを介してWindowsユーザーに配布するプログラムをPythonで作成しています。
プログラムは、ユーザーの公開鍵で暗号化されたファイルを毎日ダウンロードし、それを復号化できる必要があります。
だから、公開および非公開のPGPキーを生成し、公開キーで暗号化されたファイルを復号化できるPythonライブラリを見つける必要があります。
これはpyCryptoが行うことですか(ドキュメントは曖昧です)?他の純粋なPythonライブラリはありますか?任意の言語のスタンドアロンコマンドラインツールはどうですか?
これまで見てきたのはGNUPGだけでしたが、Windowsにインストールするとレジストリに情報が入り、どこにでもdllがスローされます。ユーザーが既にこれをインストールしているか、既存のキーリングをバックアップする方法などを心配する必要があります。むしろ、Pythonライブラリまたはコマンドラインツールを用意し、自分でキーを管理します。
更新:pyMEは動作する可能性がありますが、使用する必要のあるPython 2.4と互換性がないようです。
解決
PyCrypto
や PyMe
は必要ありません。これらのパッケージは問題ありません-Windowsでビルドする際にあらゆる種類の問題が発生します。代わりに、ウサギの穴を避けて、私がしたことをしてみませんか? gnupg 1.4.9
を使用します。エンドユーザーのマシンにフルインストールする必要はありません-ディストリビューションの gpg.exe
と iconv.dll
で十分です。それらはパスのどこかにあるか、フルパス名を使用してPythonコードからアクセスします。レジストリを変更する必要はなく、必要に応じてすべて(実行可能ファイルとデータファイル)を単一のフォルダーに制限できます。
モジュール GPG.py
があります。これは元々Andrew Kuchlingによって作成され、Richard Jonesによって改善され、Steve Traugottによってさらに改善されました。 こちらで利用可能ですが、現状のままです os.fork()
を使用するため、Windowsには適していません。元々は PyCrypto
の一部でしたが、これは PyCrypto
の他の部分から完全に独立しており、動作するためにgpg.exe / iconv.dllのみが必要です。
subprocess
モジュールを使用するTraugottの GPG.py
から派生したバージョン( gnupg.py
)があります。少なくとも私の目的では、Windowsで正常に動作します。次のことを行うために使用します。
- キー管理-生成、リスト、エクスポートなど
- 外部ソースからキーをインポートする(例:パートナー企業から受け取った公開キー)
- データの暗号化と復号化
- 署名と署名の検証
私が手に入れたモジュールは、そこにあるべきではない他のものを含んでいるので、現時点で表示するのには理想的ではありません。つまり、現時点ではリリースできません。ある時点で、おそらく次の数週間で、それを整理し、さらにユニットテストを追加して(たとえば、署名/検証用のユニットテストはありません)、リリースします元の PyCrypto
ライセンスまたは同様の商用向けライセンス)。待つことができない場合は、Traugottのモジュールを使用して自分で変更します。 subprocess
モジュールで動作させるのはそれほど面倒ではありませんでした。
この方法は、他の方法よりもはるかに痛みが少ないものです(例: SWIG
ベースのソリューション、または MinGW
/ MSYS
でビルドする必要があるソリューション)、私はそれを検討し、実験しました。私は、他の言語で書かれたシステムで同じ( gpg.exe
/ iconv.dll
)アプローチを使用しました。 C#
、同様に痛みのない結果。
PS Python 2.4およびPython 2.5以降で動作します。他のバージョンではテストされていませんが、問題は予見できません。
他のヒント
多くの掘り下げの後、私に合ったパッケージを見つけました。キーの生成をサポートすると言われていますが、私はそれをテストしませんでした。ただし、GPG公開キーを使用して暗号化されたメッセージを復号化することはできました。このパッケージの利点は、マシン上でGPG実行可能ファイルを必要とせず、OpenPGPのPythonベースの実装であるということです(実行可能ファイルのラッパーではありません)。 GPG4winとkleopatra for windowsを使用して秘密鍵と公開鍵を作成しました 以下のコードを参照してください。
import pgpy
emsg = pgpy.PGPMessage.from_file(<path to the file from the client that was encrypted using your public key>)
key,_ = pgpy.PGPKey.from_file(<path to your private key>)
with key.unlock(<your private key passpharase>):
print (key.decrypt(emsg).message)
質問は非常に古いものですが。これが将来のユーザーに役立つことを願っています。
PyCryptoはPGPをサポートしています-ただし、仕様を確認するためにテストする必要があります。
ドキュメントを入手するのは難しいですが、Util / test.py(モジュールテストスクリプト)を調べると、PGPサポートの初歩的な例を見つけることができます:
if verbose: print ' PGP mode:',
obj1=ciph.new(password, ciph.MODE_PGP, IV)
obj2=ciph.new(password, ciph.MODE_PGP, IV)
start=time.time()
ciphertext=obj1.encrypt(str)
plaintext=obj2.decrypt(ciphertext)
end=time.time()
if (plaintext!=str):
die('Error in resulting plaintext from PGP mode')
print_timing(256, end-start, verbose)
del obj1, obj2
さらに、PublicKey / pubkey.pyは次の関連メソッドを提供します:
def encrypt(self, plaintext, K)
def decrypt(self, ciphertext):
def sign(self, M, K):
def verify (self, M, signature):
def can_sign (self):
"""can_sign() : bool
Return a Boolean value recording whether this algorithm can
generate signatures. (This does not imply that this
particular key object has the private information required to
to generate a signature.)
"""
return 1
PyMe はPython 2.4との完全な互換性を主張しており、引用しています:
PyMeの最新バージョン(この時点で 書き込み)はv0.8.0です。そのバイナリ Debianのディストリビューションがコンパイルされました SWIG v1.3.33およびGCC v4.2.3で GPGME v1.1.6およびPython v2.3.5、 v2.4.4およびv2.5.2(で提供 当時の「不安定な」分布)。 Windows用のバイナリ配布 SWIG v1.3.29でコンパイルされ、 GPGME v1.1.6およびPython用のMinGW v4.1 v2.5.2(同じバイナリget インストールされ、v2.4.2で正常に動作します。 まあ)。
なぜ「私は使用しなければならないPython 2.4と互換性がないようだ」と言うのかわかりません。 -詳細を教えてください
そして、はい、それはGPGME上のセミPython(SWIGd)ラッパーとして存在します-これは、基本的に仕事をするCライブラリがあれば、Python拡張を開発する一般的な方法です。
PyPgp のアプローチははるかに単純です。単一のシンプルなPythonスクリプト:基本的には、「シェルアウト」以上のことは行いません。コマンドラインPGPコマンド。たとえば、復号化は次のとおりです。
def decrypt(data):
"Decrypt a string - if you have the right key."
pw,pr = os.popen2('pgpv -f')
pw.write(data)
pw.close()
ptext = pr.read()
return ptext
i.e。、暗号化された暗号文を pgpv -f
の標準入力に書き込み、復号化された平文としてpgpvの標準出力を読み取ります。
PyPgpも非常に古いプロジェクトですが、そのシンプルさは、現在のPython(たとえば、現在廃止されているos.popen2の代わりにサブプロセス)で動作させることは難しくないことを意味します。ただし、 PGP をインストールする必要があります。そうしないと、PyPgpは何もしません;-)。
他の人が指摘したように、PyMeはGnuPGエコシステムの一部であるGpgMEに基づいているため、このための標準的なソリューションです。
Windowsの場合、GnuPGディストリビューションとして Gpg4win を使用することを強くお勧めします。2つの理由:
GnuPG 2に基づいています。これには、とりわけ gpg2.exe
が含まれており、(最終的に、追加できます:) gpg-agent.exe
を開始できます。オンデマンド(gpg v1.xではできません)。
次に、GnuPG開発者による唯一の公式Windowsビルドです。例えば。 LinuxからWindowsに完全にクロスコンパイルされているため、準備に非フリーソフトウェアが使用されていません(セキュリティスイートにとっては非常に重要です)。