python-gnupgを使ってファイルを暗号化する

GnuPGについては以前書いた。
GnuPGを使うメモ - 偏った言語信者の垂れ流し
今回はPythonからGnuPGを使ってみる。python-gnupgを使う。
試したのはWindowXPでPython2.7。
Sphinxで書かれたドキュメントがあるのがうれしい。
python-gnupg - A Python wrapper for GnuPG — Python Wrapper for GnuPG v0.3.7 documentation
インストールは簡単。

$ pip install python-gnupg

キーを確認する

登録済みのキーを確認する。
ちなみにキーの生成などに対応するメソッドも用意されてるみたいだ。

>>> import gnupg
>>> gpg = gnupg.GPG()
>>> gpg.list_keys()
[{'dummy': u'', 'keyid': u'352AAA553B2CB729', 'expires': u'', 'length': u'2048', 'ownertrust': u'u', 'algo': u'17', 'fingerprint': u'48066A037BF7383EA6E9DE98352AAA553B2CB729', 'date': u'1309616279', 'trust': u'u', 'type': u'pub', 'uids': [u'Shinya Okano (test key) <tokibito@gmail.com>']}]

暗号化する

encryptメソッドかencrypt_fileメソッドを使って暗号化できる。
引数のrecipientsにはfingerprintの値を渡す。

>>> encrypted_data = gpg.encrypt_file(open('test.txt'), u'48066A037BF7383EA6E9DE98352AAA553B2CB729')
>>> print encrypted_data
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1.4.10 (MingW32)

hQEOA2TMBqLv+JelEAP/RjfZ0Dy9sGmXw2rNyv54Px+inIVwNqntJHe9jgCHxhNr
JFDdRFAtftRVCx23LRm4750jZpTksUkEtuQe6o3ACI2LCHLFayW5FICXX4FjBGhH
cZ3XZeJ9mRjBu5FspSVLWsJODC0U2e2WH0yTqMuYZFbsk7rrdiqxhft2s3f8BrED
/37NMlmZu6/eteuDs48yWA7h0HOwvWtE9jKt77L7H6754sfe9NN9bCxR3TasoALH
kKJDNlGMTdecWIewCT/d2KsZZrn3tjOnlFVflo0ZqTkna9HfBUzyFd+psSkA2O0B
fjIopUeBJaE7FQKSK8+wVSW+gM5Ci0BJUes9jMXumJOW0kUBmjPiFzbhHl/+YkW4
4eTktDYq9CedmKk4bw9T+ZVAcHTX3NJQ38FsfBJT24Jh7POI5CvBxv5dZ9C474gX
xA0uPZTmxv8=
=HrP3
-----END PGP MESSAGE-----

復号化する

decryptメソッドかdecrypt_fileメソッドを使う。
パスフレーズが必要な場合は引数で渡す。

>>> data = """-----BEGIN PGP MESSAGE-----
... Version: GnuPG v1.4.10 (MingW32)
...
... hQEOA2TMBqLv+JelEAP/RjfZ0Dy9sGmXw2rNyv54Px+inIVwNqntJHe9jgCHxhNr
... JFDdRFAtftRVCx23LRm4750jZpTksUkEtuQe6o3ACI2LCHLFayW5FICXX4FjBGhH
... cZ3XZeJ9mRjBu5FspSVLWsJODC0U2e2WH0yTqMuYZFbsk7rrdiqxhft2s3f8BrED
... /37NMlmZu6/eteuDs48yWA7h0HOwvWtE9jKt77L7H6754sfe9NN9bCxR3TasoALH
... kKJDNlGMTdecWIewCT/d2KsZZrn3tjOnlFVflo0ZqTkna9HfBUzyFd+psSkA2O0B
... fjIopUeBJaE7FQKSK8+wVSW+gM5Ci0BJUes9jMXumJOW0kUBmjPiFzbhHl/+YkW4
... 4eTktDYq9CedmKk4bw9T+ZVAcHTX3NJQ38FsfBJT24Jh7POI5CvBxv5dZ9C474gX
... xA0uPZTmxv8=
... =HrP3
... -----END PGP MESSAGE-----
... """
>>> data = gpg.decrypt(data, passphrase='test')
>>> data.status
'decryption ok'
>>> data.data
'\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88\n'
>>> print data.data.decode('utf8')
テスト

すんなり動かせたので、結構使いやすいかもしれない。