|
@@ -0,0 +1,63 @@
|
|
|
+#!/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
|
|
|
+
|