#!/usr/bin/python # Copyright (c) 2015 Camil Staps import sys, getopt, binascii from Crypto.Cipher import DES def main(argv): key = '' plaintext = '' ciphertext = '' # Parse arguments. Use -h for help. try: opts, args = getopt.getopt(argv, "hk:p:c:", ["key=","plaintext=","ciphertext="]) except getopt.GetoptError: usage() sys.exit(2) for opt, arg in opts: if opt == '-h': usage() sys.exit() elif opt in ("-k", "--key"): key = binascii.a2b_hex(arg) elif opt in ("-p", "--plaintext"): plaintext = binascii.a2b_hex(arg) elif opt in ("-c", "--ciphertext"): ciphertext = binascii.a2b_hex(arg) if key == '' or plaintext == '' and ciphertext == '': usage() sys.exit(2) # PyCrypto does the hard work cipher = DES.new(key, DES.MODE_ECB) encryption = '' decryption = '' if plaintext != '': encryption = cipher.encrypt(plaintext) if ciphertext != '': decryption = cipher.decrypt(ciphertext) # When plaintext and ciphertext are provided, output if DES[k](p) = c. Otherwise, output the encryption / decryption. if encryption != '' and decryption != '': print encryption == ciphertext elif encryption != '': print binascii.b2a_hex(encryption) elif decryption != '': print binascii.b2a_hex(decryption) def usage(): print 'Usage: des-demo.py -k [-p ] [-c <ciphertext>]' print ' key : an 8-byte value entered as hexadecimal numbers' print ' plaintext : an 8-byte value entered as hexadecimal numbers' print ' ciphertext : an 8-byte value entered as hexadecimal numbers' print 'At least one of plaintext and ciphertext should be provided. When both are provided, we check if DES[k](p) = c.' if __name__ == "__main__": main(sys.argv[1:])