質問

インストーラーを介して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は何もしません;-)。

M2Crypto にはPGPモジュールがありますが、実際に使用したことはありません。あなたがそれを試して、それが機能するなら、私に知らせてください(私は現在のM2Cryptoメンテナーです)。いくつかのリンク:

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

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top