import os import random import argparse from datetime import datetime from Crypto.PublicKey import RSA from consts import PRIVATE_KEY_NAME, CERT_NAME, SPLIT_CHAR, DEFAULT_MAC parser = argparse.ArgumentParser(description='encrypt expire date & mac address with private key') parser.add_argument('-d', '--date', help='expire date. eg: 2020-06-06', required=True) parser.add_argument('-m', '--mac', default=DEFAULT_MAC, help='mac address') args = parser.parse_args() def get_exponent_and_modulus(private_key_path): with open(private_key_path, 'r') as private_fp: private_key = RSA.import_key(private_fp.read()) return private_key.d, private_key.n def get_encrypt_int(mac, expire_date): encrypt_bytes = "{0}{3}{1}{3}{2}".format(mac, str(random.random()), expire_date, SPLIT_CHAR).encode('utf-8') return int.from_bytes(encrypt_bytes, byteorder='big') def main(): try: expire_date = datetime.strptime(args.date, '%Y-%m-%d') except Exception as e: print('expire date format error. eg: 2020-06-06') return if datetime.today() >= expire_date: print('expire date must later than today') return base_dir = os.path.dirname(os.path.abspath(__file__)) private_key_path = os.path.join(base_dir, PRIVATE_KEY_NAME) output_path = os.path.join(base_dir, CERT_NAME) encrypt_int = get_encrypt_int(args.mac, args.date) d, n = get_exponent_and_modulus(private_key_path) signature = pow(encrypt_int, d, n) with open(output_path, 'wb') as fp: fp.write(str(signature).encode("utf-8")) if __name__ == '__main__': main()