ASCIIセット '0' .. '9'からの文字で構成される32文字のシークレットを生成する必要があるとしましょう。これを行う1つの方法は次のとおりです。
VALID_CHARS = '0123456789'
generate_secret_string() {
random = get_crypto_random_bytes(32)
secret = ''
for (i = 0; i < 32; i++) {
secret += VALID_CHARS[random[i] % 10]
}
return secret
}
私の懸念は、私のキャラクター選択が偏っているということです。 10は256に均等に分割されないため、最初の6つのVALID_CHARSが少し発生する可能性が高くなります。
秘密の空間は1032、しかし私の生成された秘密はそれよりもエントロピーが少ない。実際のエントロピーの量を正確に計算するにはどうすればよいですか?
更新:説明
少し複雑な理由で 、暗号学者は分布の min-entropy を強度の尺度として使用します。
min-entropyは、情報理論では、Rényiファミリーのエントロピーの最小値であり、セットの予測不可能性を測定する最も保守的な方法に対応しています最も可能性の高い結果の確率の負の対数としての結果の。
最小エントロピーの1つの優れた点は、hftの答えが十分に示したシャノンエントロピー(別名平均エントロピー)よりも計算が簡単であることです(すべての代替のエントロピーを計算し、確率によって加重平均を行う必要があります)。あなたはただしなければならない:
これは、あなたの手順で選択されたどの数字も少なくとも3.30ビットのエントロピー、そしておそらくそれ以上を持つことを意味します。比較すると、一様に選択された10進数字のエントロピーはlogです。2(10)≈3.32ビット。最小エントロピーは均一なランダム数字のエントロピーよりもわずかに低くなっているため(これは、期待できる最良のケースです)、この例の数字選択バイアスは実際には問題ではないと結論付けることができます。
私の懸念は、私のキャラクター選択が偏っているということです。 10は256に均等に分割されないため、最初の6つのVALID_CHARSが発生する可能性がわずかに高くなります。
秘密の空間は10 ^ 32ですが、私の生成した秘密はそれよりもエントロピーが少なくなっています。実際にどれだけのエントロピーを正確に計算できますか?
すべての桁が等しく設定できるとは限らないため
p(i) = 1/10
すべての桁。
むしろ、あなたは持っています
p(0) = p(1) = ... = p(5) = 26/256
そして
p(6)=...=p(9) = 25/256
したがって、エントロピーには通常の式を使用します。
e = -Sum[ p(i) log(p(i)) ] = -6*(26/256)*(log2(26/256))-4*(25/256)*(log2(25/256)) = 3.32166...
1桁の "エントロピー" eの数値を取得するには(nb、p(i)が各桁の1/10の場合、これはe = log(10)になりますが、ではありません)
次に、32文字の完全な文字列のエントロピーは次のとおりです。
32*e = 106.293...
log2(10^32)
エントロピーが必要です。私の計算では、106.3ビットです。 get_crypto_random_bytes(14)
を実行し、6ビットを破棄して、値を単一の数値として扱い、10進数に変換するとどうなりますか?