Cryptographically random numbers

Paul Rubin http
Tue Mar 7 21:12:56 CET 2006

Gervasio Bernal <gervasiobernal at> writes:
> How can I generate a random string containing digits, symbols and
> letters? I will use this random string for the key of a cryptographic
> algorithm.

Generally if this is a string that some human user has to type in,
it's preferable to select some words randomly from a dictionary rather
than use an easily-garbled string of symbols.  If the string will be
handled entirely by computers, just use a random string of bytes (like
os.urandom(20)) without worrying about whether they're printable
characters.  If you really want a random-looking string of specific
characters, a simple way is:

   usable_characters = string.letters + string.digits
   # generate one character from the set (repeat as needed)
   a,b = map(ord, os.urandom(2))
   c = (a*256 + b) % len(usable_characters)

Notice that the characters will have slightly unequal probability
(unless the usable character set's size is a power of 2), but the
effect on the output entry is insignificant.

More information about the Python-list mailing list