#-*- coding: utf-8 -*-
# (c) 2012 Anders Andersen
# See http://www.cs.uit.no/~aa/dist/tools/py/COPYING for details
from sys import argv, stdin, stdout, stderr
from Crypto import Random
from Crypto.PublicKey import RSA
from Crypto.Cipher import AES
from Crypto.Util import Counter
KEYSIZE = 256
# argv[1]: RSA key file name (reads)
# argv[2]: AES key file name (creates)
# stdin: input data
# stdout: output data
if len(argv) > 2:
# Read public RSA key
frsakey = open(argv[1], "rb")
rsakey = RSA.importKey(frsakey.read())
frsakey.close()
# Generate, encrypt and save new AES key
aeskey = Random.new().read(KEYSIZE//8)
irv = Random.new().read(AES.block_size)
faeskey = open(argv[2], "wb")
faeskey.write(rsakey.encrypt(irv + aeskey, b'')[0])
faeskey.close()
# Create AES cipher
ctr = Counter.new(
AES.block_size*8,
initial_value=int.from_bytes(irv, "little"))
cipher = AES.new(aeskey, AES.MODE_CTR, counter=ctr)
# Read plaintext from stdin and write ciphertext to stdout
while True:
data = stdin.buffer.read()
if not data: break
stdout.buffer.write(cipher.encrypt(data))