123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- #!/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
|