Skip to content

Instantly share code, notes, and snippets.

@duncm
Last active April 3, 2018 07:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save duncm/8969100 to your computer and use it in GitHub Desktop.
Save duncm/8969100 to your computer and use it in GitHub Desktop.
Passphrase generator based on the Diceware method by A. G. Reinhold.
import random
import sys
try:
from urllib.request import urlopen
except ImportError:
from urllib import urlopen
DICEWARE_WORDLIST_URL = 'http://world.std.com/~reinhold/diceware.wordlist.asc'
BEALE_WORDLIST_URL = 'http://world.std.com/~reinhold/beale.wordlist.asc'
class DicewareGenerator(object):
"""
Passphrase generator based on the Diceware method by A. G. Reinhold.
More about Diceware: http://world.std.com/~reinhold/diceware.html
YOU PROBABLY SHOULDN'T USE THIS. BUT IF YOU REALLY WANT TO, THEN YOU SHOULD
READ THIS FIRST: http://world.std.com/~reinhold/dicewarefaq.html#electronic
"""
def __init__(self, url=DICEWARE_WORDLIST_URL):
self.load_diceware_file(url)
self.random = random.SystemRandom()
def load_diceware_file(self, url):
wordlist = {}
for line in urlopen(url):
try:
number, word = line.decode('utf-8').rstrip('\n').split('\t')
except ValueError:
pass
else:
wordlist[number] = word
self.wordlist = wordlist
def get_word(self, number=None):
if number is None:
number = ''.join(self.random.choice('123456') for i in range(5))
return self.wordlist[number]
def generate_passphrase(self, num_words=5, sep=' '):
return sep.join([self.get_word() for i in range(num_words)])
if __name__ == '__main__':
kwargs = {}
if len(sys.argv) > 1:
kwargs['url'] = sys.argv[1]
diceware = DicewareGenerator(**kwargs)
kwargs = {}
if len(sys.argv) > 2:
kwargs['num_words'] = int(sys.argv[2])
sys.stdout.write('%s\n' % diceware.generate_passphrase(**kwargs))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment