理論的には、これは出力フィードバック付きのストリーム暗号です。 スレッド化から、元のシーケンスの各文字は暗号化された文字に対応することになります。 たとえば、ブロック暗号がまだわからない場合は、ブロック暗号化がブロック(数バイトまたは文字)で行われます。 さらに、テキストのブロックといわゆるガンマ(ランダムなシークレットシーケンス)には多くの種類の結合があります。 この場合、出力フィードバックが使用されます。 各ガンマシンボルは、ガンマの状態を変更します。
暗号化
暗号化は非常に簡単です。 2つのシーケンスがあります。
- PCを使用しないでください
- AD JEN MWD OI
1-暗号化するテキスト。 2-ガンマ(以下の世代について)。 必要なのは、テキストを数字に変換し、テキストを5文字に分割することです(これは暗号エチケットです)。 文字数が少ない場合は、xなどの特定の記号で埋められます。
- 4 | 15 | 14 | 15 | 20 21 | 19 | 5 | 16 | 3
- 1 | 4 | 10 | 5 | 14 13 | 23 | 4 | 15 | 9
次は追加です。 26より大きい数値を取得する場合、26を減算する必要があります例4 + 1 = 5、20 + 14 = 8。
最終シーケンス:5 | 19 | 24 | 20 | 8 8 | 16 | 9 | 5 | 12。 文字に変換します: ESXTH HPIEL
解読
メッセージの復号化も非常に簡単です。 まったく同じガンマが生成され、暗号文からガンマが差し引かれます。 結果がゼロ未満の数値である場合、26が単純に追加されます(例5-1 = 4、8-14 = 20)。
- 5 | 19 | 24 | 20 | 8 8 | 16 | 9 | 5 | 12
- 1 | 4 | 10 | 5 | 14 13 | 23 | 4 | 15 | 9
合計4 | 15 | 14 | 15 | 20 21 | 19 | 5 | 16 | 3-> PCを使用しない
ガンマ生成
この暗号を非常に興味深いものにしているのは、アルゴリズムのこの部分です。 カードの完全なデッキには、52枚のカードと2枚のジョーカーが必要です。 カードには番号を付ける必要があります。できれば、念頭に置いてください(NSAに秘密を知らせたくない)。 エースからキングまで1から13まで、スーツでの順序は次のとおりです。クラブ、タンバリン、ワーム、スペード。 最後の2つの数字は、53-A、最年少のジョーカー、54-Bのシニアジョーカーと区別される必要があります。
まったく同じシャッフルされる2つのデッキが必要です。 1つのデッキがあり、友人は別のデッキを持ち、メッセージを解読します。
わかりやすくするために、デッキを28枚に減らします。 最初にこれらがこの順序で配置されたと仮定します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
1ステップ。 ジュニアジョーカー1カードをデッキに移動します。 最後であることが判明した場合は、1枚のカードの後に置きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 28 27
2ステップ。 シニアジョーカー2の位置をデッキの下に移動します。 最後の場合は、2枚のカードの後に、最後から2枚の場合は、最初のカードの後に配置します。
1 28 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
3ステップ。 2つのジョーカーで区切られた、デッキの2つの極端な部分を交換します。 この場合、番号1はデッキの最後に移動します。
28 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 1
4ステップ。 最後の数字を見てください。 デッキの最初から非常に多くのカードを数えて、最後のカードの前に置きます。 最後のカードは、アルゴリズムの可逆性のために意図的に残されています。
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 1
5ステップ。 1つの数字を見てください。 その後、非常に多くのカードを数え、この番号を覚えておいてください。 この場合、4です。これは、キーシーケンスの最初の番号です。 この手順では、デッキは変更されません。 次に、手順1〜5をn回繰り返します。 ここで、nは暗号文の文字数です。
ローカリゼーション
「ソリティア」のキリル文字版についても考えました。 すべてがかなり難しくないことが判明しました。 文字theが除外されると、32文字がロシア語のままになります。 +2ジョーカー、合計34枚のカード。 6アプリのない通常のデッキ。
実装
暗号の本質は、その不可視性です。 さて、自分よりも見た目が悪いものを判断してください:カードのデッキまたはラップトップ上の暗号化プログラム? ただし、大きなテキストを暗号化および復号化するには時間がかかります。 私は実装の全体の束を見つけました。 しかし、その中には私にとって馴染みのあるPHPはありませんでした。 とても退屈な夜で、小さなアプリケーションが誕生しました(下のリンク)。 アプリケーションの基礎は、クラス「ソリティア」です。 いくつかの必要なメソッドを実装します。
- メッセージの準備。 その言語的所属の決定、いくつかの定数の形成、および行処理。
- ガンマ準備。 より正確には、ユーザーが設定する初期シーケンス。 ガンマがわかります
- 文字ごとにガンマを取得します。 解決策はおそらく最もエレガントではありません(コメントを喜んでいます)。 バルクarray_slice-array_mergeを使用しました。
- 文字列を数値に、またはその逆に変換します。
- 行の追加と減算(暗号化と復号化)。
格付け
このようなアルゴリズムは、ブルートフォース(ブルートフォース)によってのみ解読できます。 さまざまな分析方法は実際には適用できません。 アルゴリズムの弱点は、キー(デッキ)にあります。 彼らがデッキをキャプチャした場合、彼らはそれを解読できます。
著者自身がいくつかの方法を提供しています。
1.毎回新しいキーを使用します。 特定の配置からキーを取得します(新聞の橋の列、株価の評価の数字など)。 主なものはそれらに同意することです。
2.ガンマを取得するアルゴリズムを少し変更します。 その後、デッキを取り外すと、NSAはまだ何も理解しません。
参照資料
アルゴリズムの著者による公式記事: リンク
暗号化および復号化アプリケーション: リンク
PHPクラスリファレンス: リンク