web-dev-qa-db-ja.com

Python(キーの生成、暗号化/復号化)でPGPを実行する方法

Pythonでプログラムを作成して、インストーラを介してWindowsユーザーに配布します。

プログラムは、ユーザーの公開鍵で暗号化されたファイルを毎日ダウンロードし、それを復号化できる必要があります。

したがって、Pythonライブラリを見つけて、公開および秘密のPGPキーを生成し、公開キーで暗号化されたファイルを復号化する必要があります。

これはpyCryptoが行うことですか(ドキュメントは曖昧です)?他に純粋なPythonライブラリがありますか?任意の言語のスタンドアロンコマンドラインツールはどうですか?

これまでに見たのはGNUPGだけでしたが、Windowsにインストールすると、レジストリに問題が発生し、どこにでもdllがスローされるので、ユーザーがすでにこれをインストールしているかどうか、既存のキーリングをバックアップする方法などについて心配する必要があります。 pythonライブラリまたはコマンドラインツールを用意し、自分でキーを管理するだけです。

更新:pyMEは動作するかもしれませんが、Python 2.4と互換性がないようです。使用する必要があります。

31
Greg

PyCryptoPyMeは必要ありませんが、これらのパッケージでは問題ありません-Windowsでのビルドではあらゆる種類の問題が発生します。代わりに、ウサギの穴を避けて、私がしたことをしてみませんか? _gnupg 1.4.9_を使用します。エンドユーザーのマシンでフルインストールを行う必要はありません。ディストリビューションの_gpg.exe_と_iconv.dll_で十分であり、パスのどこかに置くか、=からアクセスする必要があります。 Pythonフルパス名を使用したコード。レジストリを変更する必要はありません。必要に応じて、すべて(実行可能ファイルとデータファイル)を1つのフォルダに制限できます。

Andrew Kuchlingによって最初に作成され、Richard Jonesによって改善され、Steve Traugottによってさらに改善されたモジュール_GPG.py_があります。利用可能 here ですが、os.fork()を使用するため、Windowsには適していません。元々はPyCryptoの一部ですが、それはPyCryptoの他の部分から完全に独立しており、動作するために必要なのはgpg.exe/iconv.dllだけです

Traugottの_gnupg.py_から派生したバージョン(_GPG.py_)があり、subprocessモジュールを使用しています。少なくとも私の目的では、Windowsで正常に動作します。私は次のことを行うために使用します。

  • キー管理-生成、リスト、エクスポートなど.
  • 外部ソースからの鍵のインポート(例:パートナー企業から受け取った公開鍵)
  • データの暗号化と復号化
  • 署名と署名の検証

私が入手したモジュールは、表示すべきではない他のものが含まれているため、現時点では表示するのに理想的ではありません。つまり、現時点ではそのままリリースすることはできません。ある時点で、たぶん次の数週間で、それを片付け、さらにいくつかの単体テストを追加し(たとえば、署名/検証のための単体テストがない)、それをリリースできるようにしたいと思います(以下のいずれかで)元のPyCryptoライセンスまたは同様の商用フレンドリーライセンス)。待つことができない場合は、Traugottのモジュールを使用して自分で変更してください。subprocessモジュールで動作させるのにそれほど多くの作業ではありませんでした。

このアプローチは、他のアプローチ(例:SWIGベースのソリューション、またはMinGW/MSYSでのビルドが必要なソリューション)よりもはるかに簡単でした。私は他の言語で書かれたシステムで同じ(_gpg.exe_/_iconv.dll_)アプローチを使用しました。 _C#_、同様に痛みのない結果。

追伸Python 2.4およびPython 2.5以降で動作します。他のバージョンではテストされていませんが、問題は予見されていません。

28
Vinay Sajip

たくさん掘り下げた後、私はうまくいくパッケージを見つけました。キーの生成をサポートすると言われていますが、テストはしていません。しかし、GPG公開キーを使用して暗号化されたメッセージをなんとか解読できました。このパッケージの利点は、マシン上にGPG実行可能ファイルを必要としないことであり、PythonベースのOpenPGPの実装です(実行可能ファイルのラッパーではありません)。 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)

質問は非常に古いですが。これが将来のユーザーに役立つことを願っています。

8
Roee Anuar

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
7
Jon

他の人が指摘したように、PyMeはGnuPGエコシステムの一部であるGpgMEに基づいているため、この標準的なソリューションです。

Windowsの場合、2つの理由から、GnuPGディストリビューションとして Gpg4win を使用することを強くお勧めします。

これはGnuPG 2に基づいており、特にgpg2.exeが含まれ、(最終的には、追加できます)gpg-agent.exeをオンデマンドで開始できます(gpg v1.xはできません)。

次に、GnuPG開発者による唯一の公式Windowsビルドです。例えば。 LinuxからWindowsに完全にクロスコンパイルされているため、非フリーソフトウェアのイオタは準備に使用されていません(セキュリティスイートにとっては非常に重要です)。

3

PyMe は、Python 2.4との完全な互換性を主張し、私は引用します:

(これを書いている時点での)PyMeの最新バージョンはv0.8.0です。 Debian用のそのバイナリディストリビューションは、GPGME v1.1.6およびPython v2.3.5、v2.4.4、およびv2.5.2( 'unstable '当時のディストリビューション。Windows用のバイナリディストリビューションは、SWIG v1.3.29とMinGW v4.1でGPGME v1.1.6とPython v2.5.2(同じバイナリがインストールされていますが)また、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

つまり、暗号化された暗号文をpgpv -fの標準入力に書き込み、pgpvの標準出力を復号化された平文として読み取ります。

PyPgpも非常に古いプロジェクトですが、その単純さは、最新のPython(たとえば、現在非推奨のos.popen2ではなくサブプロセス)で動作させることは難しくないことを意味します。しかし、 [〜#〜] pgp [〜#〜] をインストールする必要があります。そうしないと、PyPgpは何もしません;-)。

3
Alex Martelli

M2Crypto にはPGPモジュールがありますが、実際に使用しようとしたことはありません。試してみて動作する場合は、お知らせください(私は現在のM2Cryptoメンテナーです)。いくつかのリンク:

更新:PGPモジュールはキーを生成する方法を提供しませんが、おそらくこれらはより低いレベルで作成できます [〜#〜] rsa [〜#〜][〜#〜] dsa [〜#〜] などのモジュール。 PGPの内部は知りませんので、詳細を調べる必要があります。また、opensslコマンドラインコマンドを使用してこれらを生成する方法を知っている場合は、それをM2Crypto呼び出しに変換するのはかなり簡単です。

3
Heikki Toivonen