#!/usr/bin/python """generate word compound passwords usage: pwgen [-c] [len default=20] -c use conjunction """ import random, sys target = 20 # default pw len use_conjunction = False n = 1 if len(sys.argv)>1 and sys.argv[1]=="-c": use_conjunction = True n = 2 if len(sys.argv)>n: target_arg = sys.argv[n] # if a len is spec'd on the cmd line try: target_arg = int(target_arg) except: print "sorry, you need to give me a number" sys.exit() if target_arg<12 or target_arg>40: print "sorry, can't do that length" sys.exit() target = target_arg f = open("/usr/share/dict/words") d = f.readlines() f.close() num = len(d) w=['','',''] for i in range(3): w[i] = d[random.randint(0,num-1)][:-1] # toss out trailing \n while len(w[i]) > 10: w[i] = d[random.randint(0,num-1)][:-1] # toss out long words whole = len(w[0])+len(w[1]) punc = " !@#$%^&*()-_=+[{]}\|;:/?.>,<`~" this_punc = punc[int(random.random() * len(punc))] conjunctions = [" and ", " and a ", " and the "," or ", " or the ", " or a ", " with a ", " with ", " with the ", " by a ", " by the ", " on a ", " on the "," on ", " in a ", " in the ", " in ", " for ", " for a ", " for the "] if use_conjunction == False: if whole >= target-6: # if 2 words is enough r = target-whole pw = w[0] + this_punc*r + w[1] else: # otherwise use 3 whole = whole + len(w[2]) r = target-whole pw = w[0] + this_punc*int(r/2) + w[1] + this_punc*int(r/2) + w[2] else: pw = w[0] + conjunctions[random.randint(0,len(conjunctions)-1)] + w[1] print "pass phrase: "+pw