module

Diceware

Crystal Diceware — générateur de passphrases Diceware.

Diceware (Arnold Reinhold, 1995) génère des passphrases mémorables à entropie mesurable :

  1. On lance N fois 5 dés à 6 faces ;
  2. Chaque tirage 1 3 4 5 6 indexe un mot dans une wordlist de 7776 (= 6^5) entrées ;
  3. La concaténation des N mots forme la passphrase.

Avec N=7, l'entropie est de 7 × log₂(7776) ≈ 90 bits — niveau standard 2026 pour une passphrase humaine de longue durée.

API

Cas le plus simple :

require "diceware"
phrase = Diceware.generate(words: 7)
# => "abacus pinacle catalpa serment grenouille ablation luminaire"

Choix explicite de la liste :

Diceware.generate(words: 7, language: :fr_mbelivo_5d)
Diceware.entropy(words: 7, wordlist: :fr_mbelivo_5d)
# => 90.47

Tirage manuel à partir de dés physiques :

rolls = ["13456", "41522", "26611", "55432", "33214", "11111", "62524"]
Diceware.generate(words: 7, source: :manual, rolls: rolls)

Sources d'aléa

  • :auto — Random::Secure (/dev/urandom). Défaut.
  • :manual — l'utilisateur fournit ses jets en rolls:.
  • :hybrid — K mots :auto + (N-K) mots :manual. Compromis quand on ne fait pas pleinement confiance au PRNG sans pour autant lancer 35 dés à la main.

Constants

DEFAULT_SEPARATOR = " "

Sépare les mots dans la passphrase produite par #generate.

VERSION = {{ (((read_file("/tmp/tmp.oiHgac/src/src/diceware/../../shard.yml")) .lines .find(&.starts_with?("version:")) || "version: 0.0.0") .gsub(/^version:\s*/, "")) .chomp }}

Lue au compile-time depuis shard.yml via le macro read_file. Cf. note mémoire feedback_shard_version_macro.md (mémoire ALOLI).

Class methods

entropy(words : Int32, wordlist : Symbol) : Float64

Calcule l'entropie en bits d'une passphrase Diceware de words mots tirés uniformément dans une liste de taille N.

H = words × log₂(N)

Pour N = 7776 et words = 7 → ~90.47 bits.

Source
entropy(words : Int32, list : Wordlist) : Float64

Calcule l'entropie en bits d'une passphrase Diceware de words mots tirés uniformément dans une liste de taille N.

H = words × log₂(N)

Pour N = 7776 et words = 7 → ~90.47 bits.

Source
generate(words : Int32, language : Symbol | Nil = nil, source : Symbol = :auto, rolls : Array(String) | Nil = nil, auto_words : Int32 = 0, separator : String = DEFAULT_SEPARATOR) : String

Génère une passphrase Diceware.

  • words — nombre de mots tirés (entropie ≈ words × 12.92 bits)
  • language — id de la liste (:eff_long, :fr_mbelivo_5d…) ou nil pour auto-détection via $LANG
  • source — :auto (défaut) | :manual | :hybrid
  • rolls — pour :manual ou :hybrid : liste de chaînes "13456" (ordre d'apparition dans la passphrase)
  • auto_words— pour :hybrid : combien des words premiers mots sont générés en :auto (les autres en :manual à partir de rolls)
  • separator — chaîne entre les mots (défaut : un espace)
Source
roll(words : Int32, source : Symbol = :auto, rolls : Array(String) | Nil = nil, auto_words : Int32 = 0) : Array(Roll)

Tire words Roll selon source. Retourne un tableau de Roll (utile pour audit, tests, mode roll du CLI qui n'affiche que les jets sans lookup).

Source

Nested types