選択に耐性のある優れたパスワードを作成する方法については、Habréを含む多くの記事が執筆されています。 今日は、この問題も解決するように設計されたデバイスについてお話したいと思います。 開発に数日しかかからず、完成したドキュメントに従って数時間で作成できます。 このデバイスは、あなたの机を見るのに興味があり、また、コンピューターオタク、システム管理者、または情報セキュリティの専門家へのオリジナルギフトとしても役立ちます。
RANDOMOUSEは、通常のコンピューターのマウスに組み込まれているランダムな文字ジェネレーターです。
最初に少し理論
アルゴリズム的な方法で乱数を生成するには、各呼び出しで次の値を生成する関数が必要です。 さらに、これらの値はランダムに「見え」(散乱)、シーケンスの繰り返し周期が最大であることが非常に望ましい(理想的には2 ^ N-1、Nは結果のビット深度)。
擬似乱数生成関数は、次の形式の多項式です。

係数gi = {0,1}(i = 0、... k)で定義されます。
関数の値を計算するには、アルゴリズム実装で最も単純なガロアスキームを使用できます。 多項式は、その係数によって2進数の形式で定義され、関数f(x)の値はアルゴリズムによって計算されます。
1. low_bit(x)= 1の場合
2.f(x)=(x / 2)xor多項式
3.そうでない場合
4.f(x)= x / 2
5.すべて
次のステップでは、計算された値が関数の引数として使用され、すべてが繰り返されます。 ジェネレーターの出力として、計算された値の値の最下位ビットが使用されます。
可能な最大長の関数の値の非反復シーケンスを与えるプリミティブと呼ばれる多項式があります。 このテーマに関するより深い理論は、たとえば
ここで読むことができ
ます 。
同じ入力データを持つどのアルゴリズムでも同じ結果が得られることは明らかです。 したがって、純粋にアルゴリズム的なアクションに基づいて、擬似乱数ジェネレーターのみを構築できます-出力の数字のシーケンスが最終的にまったく同じ順序で繰り返される場合。 さらに、シーケンス自体は非常に長くなる可能性がありますが、主な問題は、ジェネレータが同じ入力値で初期化されると、出力で常に同じ番号シーケンスが得られることです。
アルゴリズムジェネレーターに加えて、真にランダムなシーケンスを取得するには、物理的なシーケンスを使用する必要があります。 多くのイベントは、実行中のプログラムに関してランダムと見なされるコンピューター上で常に発生しています。 これは、メモリおよびドライブとのデータ交換、キーボードおよびマウスからのデータ入力、ネットワークからのパケットの受信です。 UNIXライクなオペレーティングシステムには、組み込みの乱数センサー/ dev / randomがあり、これはそのような「物理ノイズ」に基づいて蓄積されたランダムデータを出力します。 このデータを使用して、乱数シーケンスの初期要素を生成したり、RNG操作の結果にそれらを絶えず混合して、真にランダムなシーケンスを取得したりできます。
発電機
このパスワードジェネレータでは、アルゴリズム、原始多項式に基づくアルゴリズム、および物理の両方の乱数生成メカニズムが使用されます。 ハードウェア乱数センサーとして、USBバス信号線の1つが使用されます。 このライン上のマウスとコンピューターの間で「ランダム」にデータを交換する際、信号は0と1の間で切り替わり、「物理ノイズ」とアルゴリズムRNGの結果を混合するために使用されます。
ジェネレーターは、8ビットマイクロコントローラーのAtmel AVRファミリーに組み込まれています。 マイクロコントローラーを使用したおかげで、回路は非常にシンプルになり、MKに加えて、インジケーター自体といくつかの電流制限抵抗も必要になりました(使用するインジケータービットごとに1つ)。
ジェネレーターの2つのバージョンを開発しました-通常の7セグメントインジケーターと「高度な」16セグメントインジケーター用です。 後者は、「人間の言葉」でユーザーと通信できる最新の家電製品で見ることができます。 この種類のインジケータを使用すると、ラテンまたはキリル文字のアルファベットを表示できます。 残念ながら、16セグメントインジケーターが手元になかったため、「インメタル」で7セグメントバージョンのみを実装しましたが、両方のバージョンのスキームとファームウェアを掲載しています。 7セグメントインジケーターの場合、ジェネレーターは数字と一部の文字を表示できます。
両方のバージョンの概略図(クリックして拡大)
スキーム、ソースコード(アセンブラー内)、および両方のバージョン用にコンパイルされたファームウェアは
、zipアーカイブ(44k)としてダウンロードできます。
抵抗器の値は、最小電流に基づいて選択され、インジケータセグメントの許容可能な輝度を提供します。 USBポートは過負荷にしないでください。最大500mAを生成できますが、通常は100mAにプログラムされます。制限を増やすには、接続されたデバイスが記述子でこれを示す必要があります。
デバイスの設計は、主にマウス内部の空きスペースの存在と形状によって決まります。 インジケーターが見えるように配置することを忘れないでください。 インジケータがケースの半透明の壁を照らしている場合は、その下に穴を開ける必要はありません。完成品はより良くなり、「ブランド化」されます。

MKと抵抗器をレーザーアイロンで作られた小さなグラスファイバーボードに置きました。 インジケーターは1列の脚にはんだ付けされ、ボードはワイヤーで2列目の脚に接続されます。

マウスの内部では、ボードの付いたインジケータがケースの側壁の2つの補強材の間に挟まれていました(サイズは非常によく一致しており、接着剤さえ必要ありませんでした)。

3本のワイヤ(電源、データ、およびコモン)がUSBケーブルコネクタのピンにはんだ付けされています。 最も簡単な方法は、USBコネクタのピン配列を使用して、テスターを使用してワイヤの目的を決定することです(図を参照)。
MKをプログラムするために、プログラマーが接続された細い導線(ツイストペアから)がその結論に直接はんだ付けされました。 回路の動作を確認した後、導体をはんだ付けします。 USBASP USBプログラマー(http://www.fischl.de/usbasp/)とAVRDUDEプログラム(http://www.nongnu.org/avrdude/)を使用します。 ワンタイムプログラミングの場合(つまり、このデバイスのみを作成し、将来MKプログラミングに参加したくない場合)、たとえばここ(http://www.123avr.com/07。 htm)または「AVR Programmer」を検索して、特定の回路に関するレビューを読んでください。 主なことは、プログラマの最後のアクティブな要素(バッファチップ、PCチップセット:)など)とMKの間のワイヤをできるだけ短くすることです。
スキームとファームウェアに関する詳細情報
デバイスをアップグレードする場合は、内部からどのように動作するかを知りたいと思うでしょう。
USBインターフェースは、VCC(電源、+ 5V)、Data-(D-)、Data +(D +)、GND(共通ワイヤー)で指定された4本のワイヤーを使用します。 データ伝送ラインには、D + / D-が使用され、いわゆる「差動ペア」を形成します。 規格によれば、1本のワイヤでペアを送信する場合、電圧は少なくとも2.7ボルトで、もう1線では0.3ボルト以下でなければなりません。 受信すると、論理ゼロレベルは、D-ラインの電圧がD +ラインの電圧よりも0.2ボルト以上高く、その逆の状態であると見なされます。 ケーブルでは、これらの2本のワイヤがツイストペアケーブルにツイストされているという事実により、このプロトコルはデータ伝送中に高いノイズ耐性を提供します。
ペアからのワイヤの1つは、MKに組み込まれたアナログコンパレータの入力に接続されます。 このデバイスは、2つの入力の電圧を連続的に比較し、どの入力が高いかによって、デジタル信号0または1を生成します。 理論的には、ペアの両方のワイヤをコンパレータに接続することは可能ですが、ランダム信号を生成するためには、1本のワイヤで十分です。 内部電圧基準ソース(約1.1ボルト)が2番目の入力に接続されています。
プログラムのアルゴリズムは次のとおりです。
1.電源がオンになると、内部MKデバイスとI / Oポートが初期化されます(行90〜134)。 コンパレータ入力に使用されるポートは、プルアップ抵抗を接続せずに常に入力用に構成する必要があります。 そうしないと、USBインターフェイスが機能しません。 初期化後、MKはエネルギーを無駄にしないためにスリープモードに入ります。
2.タイマーの割り込みは、乱数の可能な値の数に等しい頻度で呼び出されます。 このため、値の数に関係なく、インジケーターの値の変化の頻度は1秒のままです。
電源をオンにした直後、デバイスはデモモードで動作し、各0.5秒の可能な値をすべて表示します(行150〜171)。
次に、初期RNG初期化モードへの切り替えがあります:物理センサーからのアルゴリズムRNGの初期値のセット(行173-185)。
RNGの初期化後、後続の各タイマー操作は、RNG関数の次の値の計算と、ランダム値への最下位ビットの追加につながります(行187-211)。 Nサイクル(Nは可能なランダム値の数に等しい)ごとに、ランダム値に対応するシンボルが表示され(インクルードファイルのDISPLAY_SIGNサブルーチンはセグメントの数に依存します)、現在のランダム値がリセットされ、サイクルが再開します。
3.アナログコンパレータの割り込みは、その出力値が変化するたびに呼び出されます(0から1、またはその逆)。 物理的な乱数を生成するには、タイマー0の現在の値が使用され、MK(4 MHz)の周波数で継続的にカウントされます。 RNGの初期初期化中に、タイマーカウンター0の下位ビットがRNG変数の下位ビットに書き込まれ、残りのビットが上位ビットにシフトされます(行234-244)。
32ビットが入力されると、デバイスは動作モードに入ります。 その中で、タイマーカウンター0の最小5ビットの値がランダムな値に加算され、その後、ランダムな値が可能な値の数を法として取得されます(行247-259)。
バージョン間の切り替えを簡単にするために、すべてのコード、データ、および定数は、インジケーターのビット深度に応じて、メインコードに含まれる別のファイルに取り出されます。 既存のバージョンに基づいて独自のバージョンを作成できます。
MK出力とインジケータセグメントの対応は、通常、ボード上の導体の配線の利便性に基づいて選択されます。 接続図を変更する場合は、インクルードファイル内の対応する文字ジェネレーターテーブルも変更する必要があります。 インジケーターが共通アノード(+ 5Vに接続)で使用されている場合、セグメントを点火するには、MCの出力は0である必要があります。
16ビットバージョンでは、14 MKピンが実際に使用され、セグメントの上部と下部のペアが結合されます(ただし、それぞれが独自の抵抗を介して接続されます)。 これにより、文字を表示する機能に制限が課される場合があります。 これらのセグメントを分離する必要がある場合は、DISPLAY_SIGNサブルーチンを変更して、PA0、PA1ピン(内部ジェネレーターモードでは使用されません)を使用します。
その他の用途
新しいパスワードを頻繁に作成する必要はありませんが、説明したデバイスは、ボードゲームのキューブの代わりに、乱数の生成に関連する他のアプリケーションを見つける場合があります。 さまざまなモードでの作業の利便性のために、追加のボタンでマウスを選択し、そのうちの1つをMKに接続し、このボタンをクリックしてランダムな文字のテーブルが切り替えられるか、次の乱数が表示されるようにファームウェアを変更できます
また、提案されたスキームを最小限の変更で他のデバイスで使用できます。 新年のために最初に頭に浮かぶのは、新年の花輪を作ることです。 これを行うには、インジケータの代わりにLEDをMK出力に接続します(通常、直列に接続された2つのLEDには5Vの電圧で十分です。チェーンを流れる電流が20 mAを超えない場合、電流制限抵抗は設定できません)。記号の代わりに、これらのLEDの点火の組み合わせがキャラクタージェネレーターテーブルに書き込まれます より長いLEDのチェーンを接続するには、供給電圧を上げる必要があり(その後、MKは5V安定器から電力を供給される必要があります)、トランジスタスイッチまたは専用のバッファチップを使用します。
別の質問は、物理センサー(アナログコンパレーターの入力)をどうするかです。 十分な長さ(30センチメートルで十分)のワイヤに接続できます。MKの入力抵抗は非常に高く、電磁干渉により入力電圧が変化し、必要なランダムパルスが作成されます。 デバイスにUSB(デスクトップミニクリスマスツリーのお土産)を使用する場合、入力はUSBバスデータラインに再度接続できます。