これは、 MS-Visual BASIC ver6.0 で作成しました


はじめに
Diceware Passphrase Homepage (日本語版は、結城浩 さんのページ) にある Diceware Passphrase (ダイスウェア・パスフレーズ)を実装した COM コンポーネントです。


動作環境
MS-Visual BASIC ver6.0 で作成した COM なので、32bit Windows なら、動くでしょう。

VisualBASIC6.0 ランタイムの環境が必要です。

WSH のオブジェクトからレジストリの値を読み出していますので、WSH の動作環境が必要です。

さらに、VisualBASIC,WSH,ASP などから利用できます。

ただし、ダイスウェアの本質は、本当のサイコロを使って行うことであり、コンピュータの擬似乱数を用いる事ではないという事です。


インストール方法・利用方法

まず、ランタイムと WSH をセットアップします。
(すでに、VB6 {VB6 のランタイム}がインストールされているとか、WSH は既にインストール済であるのなら、この処理は必要ありません)

sDiceware.lzh をダウンロードします。

ダウンロードしたファイルを解凍しします。
(LHAは、吉崎栄泰氏が、著作権を所有)

dll フォルダ下の sDiceware.dll が、メインモジュールです。
sDiceware.dll をどこかへ(例えば、システムフォルダ)コピーして、
MS-DOS プロンプトにて、sDiceware.dll のあるディレクトリへ行き、
"RegSvr32 sDiceware.dll"
とする事で、COM がシステムへ登録されます。
(解凍したフォルダ下の RegSvr32.bat を sDiceware.dll と同一ディレクトリにコピーして実行してもよいです)

exe フォルダ内の test.exe がマン-マシン・インターフェイスのプログラムです。

解凍したフォルダ下の sDiceware.reg を実行して、レジストリに
HKLM\Software\sDiceware\WordListpath と
HKLM\Software\sDiceware\keta を書き込みます。

Win64 環境の場合は「%windir%\SysWOW64\regedit.exe sDiceware.reg」を実行して(32Bit版の regedit.exe を使うという事)、レジストリに HKLM\Software\WOW6432Node\sDiceware\WordListpath と
HKLM\Software\WOW6432Node\sDiceware\keta を書き込みます。

次にワードリストをダウンロードします。
ワードリストは、本家ここにあります。
ファイル名は、diceware.wordlist.asc
ファイルサイズは、2002/06/14 現在、87,714byte

ワードリストから、ワードリスト以外の情報は削除します。

そして、ワードリストを適当なフォルダにコピーします。

先ほどのレジストリ HKLM\Software\(WOW6432Node)\sDiceware\WordListpath をそのワードリストへの絶対パスに変更します。
(sDiceware.reg では、c:\diceware.wordlist.asc となっています)

ちなみに、sDiceware.lzh には、VisualBASIC 6.0 プロジェクト形式のソースが添付されています。


削除方法
MS-DOS プロンプトにて、FTPex.dll のあるディレクトリへ行き、
"RegSvr32.exe /u sDiceware.dll"
とする事で、COM がシステムから削除されます。
それから、sDiceware.dll を削除します。
レジストリ HKLM\Software\sDiceware 以下を削除します。
あとは、関係あるファイル(test.exe など)を削除するだけです。


レジストリについて
二つのキーを使います。共に REG_SZ 型



公開されているメソッド



サンプル・サイト
ここ


仕組み



履歴


免責など
著作権は保持します。とりあえず...
ただし、このソフトを使用したことによって生じた、
いかなる損害についても責任は持ちません。

ソースコードについても、各自の責任において、
自由にいじってくれてもいいです。
ライセンス形態を ver1.0.0.2(2019/11/28) から修正 BSD ライセンスにします。


Version1.0.0.2DownLoad(sDiceware.lzh as 26,385byte) (sDiceware.lzh.base64)

Diceware についての考察
ランダムな文字列よりも覚えやすい


2002/06/14 現在、ワードリストは、サイコロが五個となっている。

サイコロが n 個の場合の組み合わせを示す関数(組み合わせ、存在する領域というか空間)を F(n)とすると、
F(n)=6n


で、サイコロ五個の組み合わせは、65=7776
これを X とする。

これで、一つのワードができるわけで、このワードが m 個あるパスフレーズの組み合わせを示す関数を G(m) とすると、
G(m)=Xm


たとえば、a-z,A-Z,0-9 (26+26+10=62 種)で、p 文字のパスワードとすると、その組み合わせを示す関数を H(p) とすると、
H(p)=62p


この組み合わせが同じとする p 文字は、
H(p) = G(m)
62p = Xm
p = m * Log(X) / Log(62)
ただし、Log(10)=1 とする。(底は 10 という事です)

たとえば、サイ 5 個で作るワードを 4 個組み合わせて作るパスフレーズは、
p = 4 * Log(7776) / Log(62)
p = 8.6
大体 9 文字程度と同程度の強度があるという事です。

つまり、文字の組み合わせのパスワードに対しての文字による総当りと(まぁ、いわゆる通常の総当りですな)、ダイスウェア・パスワードに対してのダイスウェアで使われている単語リストを元にした総当りとを比較した結果
9 文字のパスワードと、4ワードのダイスウェアが同程度の組み合わせがあり、総当りに対しては同程度の強度があると言う事になる。


Diceware についての考察
ランダムな文字列との強度


さて、話は続いて、
ダイスウェアで設定されるワードの平均的な文字列長さは、4.2文字である。
前回のような場合、4 ワードの平均は 16.8 文字となるので、同じ強度のランダムな文字列(文字列長は、8.6 文字)よりも長くなる。

よって、その分ダイスウェアは、総当り攻撃に対してランダムな文字列長よりも強度があると言える。

同じ文字列長で、かつ組み合わせも同じであるには、
p = m * Log(7776) / Log(62)
p = 4.2 * m
を解く必要がある。
この解は、
(p, m) = (0, 0)
のみである。
つまり p, m 共に正数での組み合わせはないという事であり、すなわち、組み合わせ数が同一の p, m に対しての文字ごとの総当り攻撃には、常にダイスウェアの方が強度があるといえる。


Diceware についての考察
(直交性がないという懸念...)


さて、サイコロ n 個で一つのワードを出すとします。
それを
I(n)
とします。
n は、F(n) の組み合わせがあります。
さて、r 個のワードでパスフレーズを以下のように定義します。
r は、1 以上の正数
I(0) I(1) ...I(i) ... I(r) = ΠI(r) (ただし、i=0...r)
s 個のワードでのパスフレーズを以下のように定義します。
s は、1 以上の正数
I(0) I(1) ... I(j) ... I(s) = ΠI(s) (ただし、j=0...s)
さて、ここで
ΠI(r) = ΠI(s) (r != s)
となる可能性がまったく無いという証明ができるかどうかである。

可能性がないのであれば、
ワードリストに登録されているワードは独立である
ワードリストに登録されているワードには直交性がある
僕は呼んでいる。

実は、
サイが 66664「?」が二つ続けた場合と、サイが 66665「??」とか一緒なので、この可能性を考慮すると、一つ上のコラムで考えているパスフレーズの強度からいくつか差し引く必要があるだろう。

たとえば、" "(半角スペース) をデリミタに使うなどする事で、ダイスウェア・パスフレーズの強度の低下を防ぐ事ができるだろう。
(でも、" "(半角スペース) をパスワードに使えるんかいな...)


ホントのサイコロのランダム性について


フジテレビ系で、関東では 2004/06/09(水) 21:00 放送の「トリビアの泉」より
日本で一般的に出回っているサイコロには、目を表す窪みが面ごとに異なっており、重心が若干ずれており、"5" が一番出やすい
らしい。

「1」が一つの窪みとしては一番大きいし、窪みの数は「6」が一番大きいが、「6」は個数が大きすぎて、若干一つあたりの窪みが小さくなっている。
また、反対の面の窪みの差こそが重心をずらす決定的要因であり、結局のところ「5」と「2」の面が一番重心がずれており、「5」が一番でやすくなっている。(逆に「2」が一番でにくいという事になる)

出やすい順に「5」「1」「4」「3」「6」「2」だとの事。
「5」が出る確率は 16.72%
「2」が出る確率は 16.61% と僅かながら誤差があるとの事だ。


JavaScript のパスワード・ジェネレータ
ここ


パスワード・ジェネレータ の COM
ここ


パスワード・メモ
ここ


実際のサイコロ
トリビア(No458)を見つけた。
リンク先がなくなると嫌なので、引用しちゃう
サイコロの出る目の確率は 1/6 ですが、数字上の理論値なんです。日本で普通に出回っているサイコロはそれぞれの面に目の数だけ穴が掘ってあります。そのため重さの差が生まれ重心がずれるので、全ての面が同じ確率で均一に出るということはないのです。実際に 8mm 四方のサイコロでそれぞれのくぼみがどれだけ彫られているか計算したところ 1 は 8.9mg、2 は2.1mg、3 は3.5mg、4 は3.8mg、5 は8.4mg、6 は7.9mgでした。ここで大事になってくるのがサイコロのそれぞれの表と裏の面の重さの差です。1 と 6 は 0.3mg、2 と 5 は 6.3mg、3 と 4 は 1.0mgでした。表と裏の面の重さの差が大きいほど重心がずれていることになり、重い方の面が下、軽い方の面が上になりやすいのです。よって重さの差が最も大きいものが 2 と 5 であることから、最も上を向きやすいのは 5 ということになります。おおざっぱにまとめてしまえば、サイコロもわずかながらではあるけど起き上がりこぼしのようになっていると言うわけです。実際に 1 万個のサイコロを同時に振ったところ、出た目数が多かった順に 1(1783個)、5(1698個)、4(1677個)、3(1633個)、6(1617個)、2(1592個、各平均は1666個) という結果でした。データ上では 5→1→4→3→6→2 の順なのですが…。これは 5 が出る確率が 16.72% であるのに対し、2 が出る確率が 16.61% とわずかであるからです。



実際のサイコロ2
トリビアの人らしい。
重心のずれたサイコロの目の出る確率 (幾何計算駆け込み寺住職 杉原厚吉)


mail to active@window.goukaku.com