ハンドコードLS47

この暗号は、Alan Kaminsky [1]によって開発されたElsieFour暗号の小さな改良です。 このバージョンでは、元の6x6の代わりに7x7文字を使用します。これは、ラテンアルファベットでもかろうじて十分です。 さらに、パスワードでキーを取得するための簡単なアルゴリズムは、より身近なオプションとして説明されています。 耐久性と安全性はElsieFourと同じです。


リポジトリには、SCADおよびSTL形式のチップの3Dモデルがあります。


サンプルチップ


レイヤーの色を変更してモデルを印刷すると、キャラクターがよりはっきりと見えるようになります。 画像を提供してくれたMartin Ptasekに感謝します。


コンピューターを信頼する場合は、単純なPython実装ls47.py使用できます。 また、CrypToolプロジェクトのBernhard Esslingerは、追加のためのいくつかのオプションと元のElsieFour暗号を実装する、より便利なオプションlc4.py提供しました。


アルファベットと文字の配置


元のバージョンと比較して、算術式を記述するための句読点、引用符、および記号が追加されています。 キリル文字のアルファベットの場合、句読点のみに制限する必要がありました。 チップ上のシンボルは次のように配置されています(ラテンおよびキリル文字のオプションが次に表示されます):


 _ abcdef _       ghijklm        nopqrst        uvwxyz .        0 1 2 3 4 5 6       1 7 8 9 , - + * 2 3 4 5 6 7 8 / : ? ! ' ( ) 9 0 . , ; ? ! 

ご覧のとおり、操作を容易にするために、チップに関する追加情報があると便利です。


チップス


暗号化/復号化操作を実行するには、たとえば、小石、ナットなど、チップに安定して収まるマークが必要です。


運営


プロセスについては、[1]で詳しく説明しています。 ここでは、プロセスの簡単な概要を示します。


暗号化


  1. 最初のチップ配置は対称キーです。 キーに従って7x7の正方形にチップを配置します。
  2. 位置(0,0)にマークを配置します。
  3. チップ間で暗号化するシンボルを見つけ、その位置をPと呼びましょうP
  4. ラベルを見てください。チップ上の数字はMの座標ですM
  5. 暗号化された文字の位置をC := P + M mod (7,7)として定義します。 位置Cある暗号化された文字を記録しますC
  6. 暗号化した元のシンボルが配置されているチップの行を右に循環します。 ラベルがこの行にある場合、チップとともに移動します。
  7. 暗号化されたシンボルが現在配置されているチップの列を循環します。 ラベルがこの列にある場合、チップとともに移動します。
  8. ラベルの位置を更新します: M := M + C' mod (7,7) 、ここでC'は暗号化された文字を含むチップ上の数字です。
  9. 残りのテキストの他のすべての文字について、手順3からの操作を繰り返します。

暗号化の例


ステップ1,2。 最初の位置は、彼がキーです。 ラベルは「d」という文字でチップ上にあります。 この段階で暗号化するシンボルは緑の楕円でマークされ、シンボル–暗号化の結果は赤の楕円でマークされます。


ステップ1


手順3.4。 シンボル「。」を暗号化します。 ラベル付きのタグは次のようになります。


ステップ1


ステップ5.記号「。」から数える 右側に5ステップ、ゼロステップダウンして、目的の文字「1」を取得します。 これは、現在の段階での暗号化の結果です。


手順6.暗号化された文字「。」を含む多数のチップを右に循環します。


ステップ6(シフト)


ステップ6(結果)


ステップ7.暗号化された文字「1」を含むチップの列を下にスライドします


ステップ7(シフト)


ステップ7(結果)


ステップ8.ラベルの位置を更新します。


暗号化されたシンボルを持つチップを見てみましょう:


ステップ8


「D」シンボルから右に6ステップ、4ステップ下にカウントし、マークの新しい位置を取得します。


解読


解読はほぼ同じ手順で実行されますが、手順5では既知の位置MCから位置Pを決定する必要がありますC PP := C - M mod (7,7)引くことで決定されます。 残りの手順は同じです。


キー生成


袋に入れたチップをよく混ぜ、一度に1つずつ取り出します。 重要なのは、これらの49の要素を再配置することです。


パスワードキーの生成


特にこれらの要素の間に補助文字がある場合、49個の要素のランダムな順列を覚えることはあまり便利ではありません。 代わりに、十分な長さの任意の文字列からキーを生成できます。


「十分な長さ」とは、「十分なレベルのエントロピーを備えている」ことを意味します。 完全なキーには約208ビットのエントロピーが格納されます。 同様の指標を実現するには、パスワードが次のとおりである必要があります(ラテン語バージョンの場合):



「標準の」128ビットのエントロピーを得るために、数値はそれぞれ約39、28、および25に削減されます。


暗号化/復号化操作が実行されるたびにキー生成に関与しないように、結果の配置を保存できます。


キー生成アルゴリズムは次のとおりです。


  1. 最初の順序でチップを配置します(つまり、元の写真のように)。 I := 0
  2. パスワードの最初の文字をPx, Pyし、対応するカウンターで数字をマークします: Px, Py
  3. I行目のPx位置を右にシフトします
  4. I列目をPy位置まで下に移動します
  5. I := I + 1 mod 7 、ステップ2から次のパスワード記号まで繰り返します
  6. 結果として得られるチップ配置が重要です

区別できない暗号文


同じソーステキストに対しても異なる暗号化テキストを取得するには、あらかじめ決められた長さのランダムなワンタイムコードを追加する必要があります。 たとえば、バッグからランダムに選択されたNチップ、 Nの推奨値は少なくとも10です。


また、「yes、please」と「no」の識別を防ぐために、元のメッセージにランダムな数の文字を追加する価値があります。これは、キーを知らず2390238_9を見なくても簡単に実行できます。


認証された暗号化


暗号文は送信中に変更されたり、人間の処理中にエラーが発生したりする可能性があるため、メッセージの最後に署名を追加することをお勧めします。 ちょうど__です。 署名が期待を満たしていない場合(処理中にエラーが発生した場合に簡単に発生する可能性があります)、再試行(復号化でエラーがあった場合はどうなりますか)、または送信者にメッセージの転送を依頼します。


暗号出力はメッセージに依存するため、これが可能です。雪崩効果により、途中のどこかで値が間違っている場合、メッセージは数文字後に意味を失います。


参照資料


[1] カミンスキー、アラン。 「ElsieFour:人と人とのコミュニケーションのためのローテク認証済み暗号化アルゴリズム。」 IACR Cryptology ePrint Archive 2017(2017):339。



Source: https://habr.com/ru/post/J352448/


All Articles