Skip to content

Entropy calculation with acrostic is wrong #127

@ilyagr

Description

@ilyagr

If there are 382 words that start with 'a', then the entropy of the acrostic 'aaaaa' should be ln_2(382)*5. However, this is not what xkcdpass reports:

$  xkcdpass -V --acrostic 'a'
With the current options, your word list contains 382 words.
A 1 word password from this list will have roughly 8 (8.58 * 1) bits of entropy,
assuming truly random word selection.

anyone

$  xkcdpass -V --acrostic 'aaaaa'
With the current options, your word list contains 1910 words.
A 5 word password from this list will have roughly 54 (10.90 * 5) bits of entropy,
assuming truly random word selection.

amiable activism arise aspire ageless

(The correct answer would be 8.58 * 5 in the second example)

I believe the problem is here:

if options.acrostic:
worddict = wordlist_to_worddict(wordlist)
numwords = len(options.acrostic)
length = 0
for char in options.acrostic:
length += len(worddict.get(char, []))

Currently, it computes the entropy as num_words * ln_2(sum of lengths of word lists for each letter in the acrostic).

The correct formula for the entropy is ln_2(# of words for letter 1) + ln_2(#of words for letter 2) + .... Separating length and num_words doesn't make sense in this setting.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions