Added --entropy option for psuedoscientific entropy report
authorRob Lanphier <redacted>
Sun, 20 Nov 2011 05:46:35 +0000 (21:46 -0800)
committerRob Lanphier <redacted>
Sun, 20 Nov 2011 05:46:35 +0000 (21:46 -0800)
xkcd-password.py

index 799a9193d7eba51df13775c931a00bab2af50c41..9657e566813afe22915ceb9390b2c515834cbc77 100755 (executable)
@@ -33,6 +33,7 @@ import os
 import sys
 import optparse
 import re
+import math
 
 def generate_wordlist(wordfile=None, min_length=5, max_length=9, valid_chars='.'):
     """
@@ -66,6 +67,21 @@ def generate_wordlist(wordfile=None, min_length=5, max_length=9, valid_chars='.'
             raise SystemExit
     return words
 
+def report_entropy(length, numwords):
+    """
+    Report number of words and bits of entropy
+    """
+    bits = math.log(length, 2)
+    if(int(bits)==bits):
+        print ("Your word list contains %i words, or 2^%i words. " % (length, bits))
+    else:
+        print ("Your word list contains %i words, or 2^%0.2f words. " % (length, bits))
+
+    print ("A %i word password from this list will have roughly %i (%0.2f * %i) bits of entropy," % 
+           (numwords, int(bits*numwords), bits, numwords)),
+    print "assuming truly random word selection."
+
+
 def generate_xkcdpassword(wordlist, n_words=4, interactive=False):
     """
     generate an XKCD-style password from the words in wordlist
@@ -118,6 +134,9 @@ if __name__ == '__main__':
     parser.add_option("-v", "--valid_chars", dest="valid_chars",
                       default='.',
                       help="Valid chars, using regexp style (e.g. '[a-z]'")
+    parser.add_option("-e", "--entropy", dest="entropy",
+                      default=False, action="store_true",
+                      help="Report entropy for given option")
 
     (options, args) = parser.parse_args()
 
@@ -134,6 +153,9 @@ if __name__ == '__main__':
     my_wordlist = generate_wordlist(wordfile=options.wordfile, 
                                     min_length=options.min_length, 
                                     max_length=options.max_length,
-                                    valid_chars=options.valid_chars) 
-    print generate_xkcdpassword(my_wordlist, interactive=options.interactive)
+                                    valid_chars=options.valid_chars)
+    if options.entropy:
+        report_entropy(length=len(my_wordlist), numwords=options.numwords)
+    print generate_xkcdpassword(my_wordlist, interactive=options.interactive,
+        n_words=options.numwords)
 
git clone https://git.99rst.org/PROJECT