40

I'm making a program in Python to be distributed to windows users via an installer.

The program needs to be able to download a file every day encrypted with the user's public key and then decrypt it.

So I need to find a Python library that will let me generate public and private PGP keys, and also decrypt files encrypted with the public key.

Is this something pyCrypto will do (documentation is nebulous)? Are there other pure Python libraries? How about a standalone command line tool in any language?

All I saw so far was GNUPG but installing that on Windows does stuff to the registry and throws dll's everywhere, and then I have to worry about whether the user already has this installed, how to backup their existing keyrings, etc. I'd rather just have a python library or command line tool and mange the keys myself.

Update: pyME might work but it doesn't seem to be compatible with Python 2.4 which I have to use.

4

7 に答える 7

37

これらのパッケージは必要ないかもしれませんがPyCrypto、問題はありません。Windowsでのビルドにはあらゆる種類の問題があります。PyMe代わりに、うさぎの穴を避けて、私がしたことをしてみませんか?を使用しgnupg 1.4.9ます。エンドユーザーのマシンに完全にインストールする必要はありません。ディストリビューションからだけgpg.exeiconv.dll十分です。パスのどこかに配置するか、完全なパス名を使用してPythonコードからアクセスする必要があります。レジストリを変更する必要はありません。必要に応じて、すべて(実行可能ファイルとデータファイル)を1つのフォルダーに限定できます。

GPG.pyAndrew Kuchlingによって最初に書かれ、Richard Jonesによって改良され、SteveTraugottによってさらに改良されたモジュールがあります。ここで入手できますが、そのままではを使用するため、Windowsには適していませんos.fork()。元々はの一部ですがPyCrypto他の部分から完全に独立しており、PyCrypto動作するために必要なのはgpg.exe/iconv.dllのみです

モジュールを使用するgnupg.pyTraugottのから派生したバージョン( )があります。これは、少なくとも私の目的では、Windowsで正常に機能します。私はこれを使用して次のことを行います。GPG.pysubprocess

  • キー管理-生成、リスト、エクスポートなど。
  • 外部ソースからキーをインポートします(例:パートナー企業から受け取った公開キー)
  • データの暗号化と復号化
  • 署名して署名を確認する

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

このアプローチは、私が検討して実験した他のアプローチ(たとえばSWIG、ベースのソリューション、またはMinGW/を使用して構築する必要があるソリューション)よりもはるかに苦痛が少ないものでした。MSYS私は他の言語で書かれたシステムでも同じ(gpg.exe/ iconv.dll)アプローチを使用しました。たとえばC#、同じように痛みのない結果が得られました。

PSPython2.4およびPython2.5以降で動作します。他のバージョンではテストされていませんが、問題は予測されていません。

于 2009-06-27T22:12:35.683 に答える
7

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
于 2009-06-24T08:30:10.367 に答える
3

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

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

これは GnuPG 2 に基づいており、とりわけ が含まれており、オンデマンドでgpg2.exe開始できます (gpg v1.x はできません)。gpg-agent.exe

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

于 2009-07-31T18:26:43.300 に答える
3

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

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

于 2009-06-25T04:10:59.127 に答える
3

PyMeは Python 2.4 との完全な互換性を主張しています。

PyMe の最新バージョン (この記事の執筆時点) は v0.8.0 です。Debian 用のバイナリ ディストリビューションは、GPGME v1.1.6 および Python v2.3.5、v2.4.4、および v2.5.2 用の SWIG v1.3.33 および GCC v4.2.3 でコンパイルされました (当時は「不安定な」ディストリビューションで提供されていました)。Windows 用のバイナリ ディストリビューションは、GPGME v1.1.6 および Python v2.5.2 用の SWIG v1.3.29 および MinGW v4.1 でコンパイルされました (ただし、同じバイナリがインストールされ、v2.4.2 でも正常に動作します)。

「私が使用しなければならない Python 2.4 と互換性がないようです」とあなたが言う理由がわかりません。具体的に教えてください。

はい、それは GPGME の半 Pythonic (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 -fpgpv の標準出力を復号化された平文として読み取ります。

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

于 2009-06-24T16:03:44.223 に答える