import gnupg import os import sys # Encrypt and decrypt using GPG public-key cryptography # - 2048 bit RSA private key # - 256 bit AES block cipher # - standard and compatible # - enables remote encryption # - reliable, stood the test of time # - not so fast, not so compact def gen_key(key): home, uid, passphrase = key.split(' ') gpg = gnupg.GPG(gnupghome=home) input_data = gpg.gen_key_input( name_email=uid, passphrase=passphrase) fingerprint = gpg.gen_key(input_data) return fingerprint def encrypt(text, key): home, uid, passphrase = key.split(' ') gpg = gnupg.GPG(gnupghome=home) result = gpg.encrypt(text, uid) if not result.ok: raise Exception("gpg.encrypt failed: "+result.status+" "+result.stderr) ciphertext = str(result) return ciphertext def decrypt(ciphertext, key): home, uid, passphrase = key.split(' ') gpg = gnupg.GPG(gnupghome=home) result = gpg.decrypt(ciphertext, passphrase=passphrase) if not result.ok: raise Exception("gpg.decrypt failed: "+result.status+" "+result.stderr) text = result.data return text def test(n=2): crypto = sys.modules[__name__] key = './gpghome test@aiki.info passphrase' home, uid, passphrase = key.split(' ') if not os.path.exists(home): fingerprint = crypto.gen_key(key) print "key fingerprint", fingerprint else: gpg = gnupg.GPG(gnupghome=home) pubkeys = gpg.list_keys() print "key fingerprints", pubkeys.fingerprints text = "hello \0 world, this is a little crypto test\0" print "text, len", repr(text), len(text) for i in range(0, int(n)): enc = crypto.encrypt(text, key) print "encrypted", enc dec = crypto.decrypt(enc, key) assert dec == text, "crypto.test" print "decrypted OK" if __name__ == "__main__": op = sys.argv[1] print globals()[op](*sys.argv[2:])