Generating Offline Passphrases

I'm a huge fan of https://makemeapassword.ligos.net/generate/readablepassphrase, and regularly advise people to use it when generating passwords that need to be memorized or typed frequently. However, there's been numerous times people have expressed concerns that they're effectively generating passwords on someone else's computer. This is (typically) an acceptable risk to me. However, I understand that my threat model is not your threat model. Fortuity, there's an offline version of the same tool with even more flexibility!

ligos/readablepassphrasegenerator
The Readable Passphrase Generator generates passphrases which are (mostly) grammatically correct but nonsensical. These are easy to remember (for humans) but difficult to guess (for humans and comp...

Go to the link above, and look for the "PassphraseGenerator.Console.X.X.X.zip". This file contains the PassphraseGenerator.exe offline generator, and the necessary wordlists and configuration files. Here's a sample of it's default usage.

C:\PassphraseGenerator> .\PassphraseGenerator.exe
Readable Passphrase Generator 1.2.0
Generating 10 phrase(s) of strength 'Random'...
Must be between 1 and 999 characters.
Dictionary contains 15,346 words (loaded in 84.99ms)
Average combinations ~1.279E+024 (~80.08 bits)
Total combinations 6.406E+010 - 8.802E+038 (35.90 - 129.37 bits)
Using no mutators

their corral blunted the quart and the matriarch
tarantulas are sullying the modulator but not the uncharted hydrant
those tests mumbled meteorites might want that impact
a sandbank thought the hem exhibits sincerely since my fishtail
a sawyer chuckled emulators fancies that tear
my spinnaker warned my dolt and a scooter
the motivator spoke the capsized chemical has insured prior to an enemy
her bosom renewed an invasion
a leper convulses a beehive after a swindler
your steps reasoned the peafowl will file this jackass

Generated 10 phrase(s) in 76.26ms.

C:\PassphraseGenerator>

Using this, you can generate custom phrases on your own system with more options than are available in the online version. For example, we can generate 5 phrases, with a minimum length of 15 and maximum length of 20. We're going to use a - as our separator instead of a space. We're going to capitalize one random word, and add a number to the end of one random word.

C:\PassphraseGenerator> .\PassphraseGenerator.exe --count 5 --min 15 --max 20 --separator '-' --mutUpper wholeword --mutUpperCount 1 --mutNumeric endofword --mutNumericCount 1
Readable Passphrase Generator 1.2.0
Generating 5 phrase(s) of strength 'Random'...
Must be between 15 and 20 characters.
Dictionary contains 15,346 words (loaded in 85.60ms)
Average combinations ~1.279E+024 (~80.08 bits)
Total combinations 6.406E+010 - 8.802E+038 (35.90 - 129.37 bits)
Using upper case word and numeric mutators (1 word(s), 1 number(s))

THE-throwbacks-bid7
OWLS2-stick-a-wuss
a-ranch-RELAXES5
Todd4-graded-THE-map
WARNINGS0-scuttle

Generated 5 phrase(s) in 237.86ms.
C:\PassphraseGenerator>

Let me be clear, neither of these are particularly good for your average use case. The first are way too long for most people (max of 999 characters!) the second are painful to type in and probably not long enough. You probably want to set the min and max limit, if nothing else, to something reasonable. Be sure to check out all the other options available though.

C:\PassphraseGenerator>.\PassphraseGenerator.exe --help
Usage: PassphraseGenerator.exe [options]
  -c --count nnn        Generates nnn phrases (default: 10)
  -s --strength xxx     Selects phrase strength (default: Random)
                xxx =     [normal|strong|insane][equal|required][and|speech]
                          or 'custom' or 'random[short|long|forever]'
  --min xxx             Specifies a minimum length for phrases (def: 1)
  --max xxx             Specifies a maximum length for phrases (def: 999)
  --spaces true|false   Includes spaces between words (default: true)
  --separator x         Character(s) to separate words (default:  )
  -n --nongrammar nn    Creates non-grammatical passphrases of length nn

  -m --stdMutators      Adds 2 numbers and 2 capitals to the passphrase
  -m2 --altMutators     Adds 2 numbers and capitalises a single word
  --mutUpper xxx        Uppercase mutator style (default: Never)
       xxx =      [startofword|anywhere|runofwords|wholeword]
  --mutUpperCount nn    Number of capitals to add (default: 2
  --mutNumeric xxx      Numeric mutator style (default: Never)
       xxx =      [startofword|endofword|startorendofword|endofphrase|anywhere]
  --mutNumericCount nn  Number of numbers to add (default: 2
  --mutConstant xxx     Constant mutator style (default: Never)
       xxx =      [startofphrase|endofphrase|middleofphrase|anywhere]
  --mutConstantValue x  String to use as constant (default: .)

  -l --loaderdll path   Specifies a custom loader dll
  -t --loadertype path  Specifies a custom loader type
  -a --loaderargs str   Specifies arguments for custom loader
  -d --dict str         Specifies a custom dictionary file
  -p --phrase path      Specifies a custom phrase file
                          Must use -strength custom

  -q --quiet            Does not display any status messages (default: show)
  -h --help             Displays this message
See https://github.com/ligos/readablepassphrasegenerator for more information
Contact Murray via GitHub or at https://keybase.io/ligos

C:\PassphraseGenerator>

Since the source code is available, you can inspect this and build your own if you want to (which is beyond the scope of this article). You can also monitor network connections to ensure that nothing is behind sent out (again, beyond the scope).

If the author ever reads this, I would love to see a --minWords and --maxWords option, to set the min/max number of words used in the phrase rather than overall length. I would also love to see a --muteSpecial and --mutSpecialCount to add symbols to a passphrase for those sites that still require them.