Skip to content

dclobato/diceware

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

diceware

Gerador de wordlist Diceware em português brasileiro, a partir de dicionários em texto simples.

O programa produz uma lista de exatamente 6ⁿ palavras (por padrão, 6⁵ = 7 776), formatada no padrão canônico Diceware — cada palavra precedida pelo código numérico correspondente ao lançamento de n dados de seis faces.


Índice


Motivação

O método Diceware, criado por Arnold Reinhold em 1995, permite gerar passphrases seguras e memoráveis usando dados físicos como fonte de aleatoriedade. A robustez do método depende de duas propriedades da lista de palavras:

  1. Tamanho exato de 6ⁿ entradas — cada lançamento de n dados mapeia univocamente para uma palavra, sem viés.
  2. Unicidade de prefixo — palavras com início idêntico aumentam o risco de erro de digitação e dificultam a memorização. A lista gerada por este programa garante unicidade de prefixo pelo comprimento mínimo necessário.

Este projeto pretende construir uma wordlist Diceware que possa ser oficial amplamente adotada para o português brasileiro de forma reproduzível e auditável.


Como funciona

O pipeline de geração opera em três etapas:

1. Pré-processamento por prefixo único

O programa lê o dicionário de entrada (uma palavra por linha, ordenado lexicograficamente) e retém apenas a primeira palavra de cada prefixo de comprimento k. O valor de k começa em 4 e é incrementado automaticamente até que o número de candidatas supere o alvo de 6ⁿ palavras.

abacate   ← mantida (prefixo "abac" visto pela primeira vez)
abacaxi   ← descartada (prefixo "abac" já registrado)
abaciais  ← descartada (prefixo "abac" já registrado)
abadessa  ← mantida (prefixo "abad" novo)

2. Refinamento por comprimento

Das candidatas obtidas, o programa filtra por comprimento mínimo crescente (a partir de 6 letras), descartando os grupos mais curtos inteiros enquanto o total permanecer acima do alvo. Quando o descarte de um grupo inteiro ultrapassaria o alvo para baixo, apenas as palavras necessárias daquele grupo são removidas — as últimas em ordem lexicográfica, preservando as primeiras.

3. Formatação Diceware

As 6ⁿ palavras resultantes, ordenadas lexicograficamente e normalizadas para minúsculas, são emparelhadas com os códigos gerados por itertools.product(range(1, 7), repeat=n) — que produz exatamente a sequência 11...1 até 66...6 na ordem correta.


Instalação

O projeto não possui dependências externas além da biblioteca padrão do Python 3.9 ou superior.

git clone https://github.com/dclobato/diceware.git
cd diceware

Uso

python3 diceware.py [-h] [-d N] entrada saida
Argumento Descrição
entrada Arquivo de dicionário (uma palavra por linha, ordenado lexicograficamente).
saida Arquivo de saída no formato Diceware.
-d N, --dados N Número de dados. O alvo será 6^N palavras. Padrão: 5 (7 776 palavras).

Exemplos

# Configuração padrão: 5 dados → 7 776 palavras
python3 diceware.py br-sem-acentos.txt lista.txt

# 4 dados → 1 296 palavras (lista compacta)
python3 diceware.py br-sem-acentos.txt lista-4d.txt -d 4

# 6 dados → 46 656 palavras (exige dicionário muito rico)
python3 diceware.py br-sem-acentos.txt lista-6d.txt -d 6

Saída do programa

Configuração: 5 dado(s) → alvo de 7,776 palavras (6^5).

Buscando comprimento de prefixo mínimo para superar 7,776 candidatas...
  Prefixo 4: 6,958 candidatas
  Prefixo 5: 12,450 candidatas
  → Usando prefixo de 5 letras (12,450 candidatas).

Refinando por comprimento mínimo...
  → Comprimento mínimo final: 7 letras
  → Distribuição: {7: 1204, 8: 2891, 9: 2109, ...}

Concluído. Palavras escritas: 7,776 → 'lista.txt'
Exemplo das primeiras entradas:
  11111   abafado
  11112   abafador
  11113   abaixado
  11114   abandonar
  11115   abastado

──────────────────────────────────────────────────────────
  Entropia da passphrase  (lista com 7,776 palavras, 5 dado(s))
──────────────────────────────────────────────────────────
  Palavras       Espaço de busca  Entropia  Avaliação
──────────────────────────────────────────────────────────
         1          7.78x10^3     12.92b  fraco x
         2          6.05x10^7     25.85b  fraco x
         3          4.71x10^11    38.77b  fraco x
         4          3.66x10^15    51.70b  fraco x
         5          2.84x10^19    64.62b  aceitável
──────────────────────────────────────────────────────────
  bits/palavra = log₂(7,776) = 12.9248 b
──────────────────────────────────────────────────────────

Entropia

A entropia de uma passphrase Diceware é calculada como:

H = w × log₂(N)

onde N é o tamanho da lista e w é o número de palavras escolhidas. Como N = 6ⁿ, isso se reduz a w × n × log₂(6) — exatamente o valor canônico da especificação original de Reinhold.

Para a lista de 7 776 palavras (5 dados), cada palavra contribui com 12,92 bits de entropia.

Nota sobre o NIST SP 800-63B-4 (julho 2025): A versão vigente do NIST SP 800-63B-4 abandonou limiares de entropia em bits como critério normativo para senhas escolhidas pelo usuário, cuja distribuição real é impossível de modelar, e passou a exigir comprimento mínimo de 15 caracteres como principal controle. Para passphrases Diceware, porém, a entropia é exata (distribuição uniforme e conhecida), de modo que H = w × log₂(N) continua sendo a medida correta. As faixas da tabela abaxio refletem o consenso da comunidade de segurança (EFF, Reinhold), não recomendações normativas do NIST.

Faixa Avaliação
< 60 bits Fraco - inadequado para uso moderno
60 - 80 bits Aceitável - uso pessoal de baixo risco
80 - 100 bits Forte - recomendado pelo NIST SP 800-63B
> 100 bits Excelente - resistente a ataques futuros

Para atingir 80 bits com a lista padrão, são necessárias 7 palavras (~90,5 b). Com 6 palavras chega-se a ~77,5 b, razoável para uso cotidiano. O EFF recomenda passphrases de pelo menos 6 palavras para contas de alto valor.


Fontes de dicionários

O programa aceita qualquer arquivo de texto com uma palavra por linha, preferencialmente sem acentuação e ordenado lexicograficamente. As fontes abaixo podem ser consideradas

IME-USP — Dicionários do Prof. Paulo Feofiloff

https://www.ime.usp.br/~pf/dicios/

Coleção mantida pelo Instituto de Matemática e Estatística da USP. Disponibiliza listas de palavras do português em diferentes formatos, incluindo versões sem acento. É a fonte disponível publicamente para o português brasileiro e recomendada como ponto de partida para este projeto.

fserb/pt-br

https://github.com/fserb/pt-br

Repositório com listas de palavras do português brasileiro derivadas de fontes abertas, organizadas por frequência e categoria. Útil para complementar o dicionário do IME-USP com vocabulário mais contemporâneo.

Hunspell PT-BR (LibreOffice / Mozilla)

https://github.com/LibreOffice/dictionaries/tree/master/pt_BR

Dicionário ortográfico utilizado por LibreOffice, Mozilla Firefox e outros projetos de código aberto. O arquivo .dic pode ser convertido para o formato de entrada deste programa com um pré-processamento simples:

# Remove metadados da primeira linha e a informação de afixo após a barra
tail -n +2 pt_BR.dic | cut -d'/' -f1 | sort > br-hunspell.txt

Wordlist do projeto BrazilianDiceware (referência)

https://github.com/thoughtworks/dadoware

Implementação alternativa de wordlist Diceware para o português (projeto arquivado em Jun, 2025. Útil como referência para comparação e validação da lista gerada por este projeto.


Formato de saída

Cada linha do arquivo de saída segue o formato canônico Diceware, com código e palavra separados por tabulação:

11111	abafado
11112	abafador
11113	abaixado
...
66664	zurziu
66665	zurrapa
66666	zurzona

Para usar a lista na prática, role n dados físicos (ou use um gerador de números aleatórios criptograficamente seguro), localize o código resultante na lista e anote a palavra correspondente. Repita para cada palavra da passphrase desejada.


Licença

MIT License. Consulte o arquivo LICENSE para os termos completos.

About

Construção de lista de palavras para uso com diceware

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors