July 2002
Intermediate to advanced
608 pages
15h 46m
English
Credit: Luther Blissett
You need to create new passwords randomly—for example, to assign them automatically to new user accounts—and want the passwords to be somewhat feasible to remember for typical users, so they won’t be written down.
We can use a pastiche approach for this, mimicking letter n-grams in actual English words. A grander way to look at the same approach is to call it a Markov Chain simulation of English:
import random, string
class password:
# Any substantial file of English words will do just as well
data = open("/usr/share/dict/words").read().lower( )
def renew(self, n, maxmem=3):
self.chars = []
for i in range(n):
# Randomly "rotate" self.data
randspot = random.randrange(len(self.data))
self.data = self.data[randspot:] + self.data[:randspot]
where = -1
# Get the n-gram
locate = ''.join(self.chars[-maxmem:])
while where<0 and locate:
# Locate the n-gram in the data
where = self.data.find(locate)
# Back off to a shorter n-gram if necessary
locate = locate[1:]
c = self.data[where+len(locate)+1] if not c.islower( ): c = random.choice(string.lowercase) self.chars.append(c) def _ _str_ _(self): return ''.join(self.chars) if _ _name_ _ == '_ _main_ _': "Usage: pastiche [passwords [length [memory]]]" import sys if len(sys.argv)>1: dopass = int(sys.argv[1]) else: dopass = 8 if len(sys.argv)>2: length = int(sys.argv[2]) else: length = 10 if len(sys.argv)>3: memory = int(sys.argv[3]) else: memory = 3 onepass = password( ...