User Tools

Site Tools


pwg

This is an old revision of the document!


pwg (Yet Another Password Generator)

This generates random passwords from an in-built list of words, in this case all the 3 to 5 letter words made only of standard letters in the default Debian/Mint/Ubuntu English dictionary1). It defaults to a single 12 or more character PW, but you can specify longer or shorter, and multiples with two numbers. Running pwg 20 5 produces;

steve@spearmint:~$ pwg 20 5
Nicks-Edger4Busy%Axed
Fiji4Torus*Low6Ewes@Slack
Scold3Owned$Ekes8Hobby
Palm8Feb_Quite4Aped%Bodes
Puff%Bass0CATV_Claim6Sent
#!/bin/bash
# Words between 3 and 5 characters
# grep -E '^[A-Za-z]{3,5}$' /usr/share/dict/words >> pwg
# Above gets only words with easily typed characters
#
# SRJ 2026-03-29 based on https://www.henriaanstoot.nl/2018/09/14/password-generator-dutch/
#
Self="$(dirname ${0})/$(basename ${0})"
 
# Minimum length of Pass
Len=12
# If a number was passed as an argument, set length to it
[[ ${1} == ?(-)+([0-9]) ]] && Len=${1}
 
Count=1
# If two numbers are passed in, give a list of that many passphrases
[[ ${2} == ?(-)+([0-9]) ]] && Count=${2}
 
True=1
False=0
Sym='!@#$%^&*-_'
Num='1234567890'
SymCnt=${#Sym}
NumCnt=${#Num}
Loop=1
 
while [ ${Loop} -le ${Count} ]
do
    TorF=$(( RANDOM % 2 ))
    # Below deletes from the begining of the script up to and including
    # the #WORDS line, then sends the rest of the lines to the shuf
    # command that emits a single word.
    First=$(sed '1,/^#WORDS$/d' ${Self} | shuf -n 1 )
    	# Below is a bash builtin that capitalizes the first letter, so
	# word becomes Word.
        String=${First^}
        while [ ${#String} -le ${Len} ]
          do
          if [ ${TorF} -eq ${True} ]; then
          TorF=${False}
          String+="${Sym:$(($RANDOM%${SymCnt})):1}"
          else
          TorF=${True}
          String+="${Num:$(($RANDOM%${NumCnt})):1}"
          fi
	  This=$(sed '1,/^#WORDS$/d' ${Self} | shuf -n 1 )
          String+=${This^}
        done
        echo ${String}
   ((Loop++))
done
 
exit 0
#WORDS


After you copy and paste the above, then add a dictionary to the end of the script with;

grep -E '^[A-Za-z]{3,5}$' /usr/share/dict/words >> pwg

On my system, that produces a list of 10756 words, the password 'Puff%Bass0CATV_Claim6Sent' generated above has 94 bits of entropy, and is one of 10756 x 10 x 10756 x 10 x 10756 x 10 x 10756 x 10 x 10756. That's one password out of 1.4396*10^24. At 100 guesses per second, that's 456 trillion years if I did the math right.

1)
The grep removes words with apostrophes, accents, umlauts, etc…
pwg.1774837202.txt.gz · Last modified: by steve