VIC暗号はこれまでに考案された最も複雑な鉛筆と紙暗号の一つです。ソビエトのスパイReinoHäyhänen(コード名「VICTOR」)が1950年代に使用した主な原理は、難読化によるセキュリティです。多くの難読化の。
あなたの仕事は、メッセージを受け取り、VIC暗号を使用してエンコードするプログラムまたは関数を作成することです。私はまたしているここVIC暗号デコーダチャレンジを掲載します。次の指示のいずれかが不明な場合は、コメントでそれらについて尋ねることをtoしないでください。指示はこのサイトから適応されます。
VIC暗号のエンコード
準備
5つの入力が必要です。
- 平文メッセージ
- あなたの言語で最も一般的な文字を含む短いキーワードまたはフレーズ
- 引用や歌の行などのキーフレーズ(20文字以上)
- 日付(または6桁以上の別の数値)
- パーソナルエージェント番号
実際には、これらの最後の4つは、送信者と受信者のエージェント番号がエンコードで使用されるかどうかを含め、送信者と受信者によって事前に合意される必要があります。
私のメッセージ例は次のとおりです。 We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
英語でエンコードします(ただし、好みの言語とアルファベットを使用できます)A, E, I, N, O, R, S, T
。英語のアルファベットで最も一般的な文字はです。キーワードを使用しますSENATORI
。
私のキーフレーズは、リチャード・ファインマンの引用です:「最初の原則は、あなたは自分をだましてはいけないということです—そして、あなたはだますのが最も簡単な人です。」
日付として、2016年7月31日(形式3172016
)を使用します。これは、この説明を書いた日です。
私が自分用に選んだ個人番号は9
です。
手順の概要
- 次の手順で使用する中間キーを導出します。
- 跨ぐチェッカーボードを作成して適用します。
- 最初の転置テーブルを構築して適用します。
- 2番目の(中断された)転置テーブルを作成して適用します。
- メッセージインジケータグループを挿入して、メッセージを完成させます。
サブメカニズム
問題の本質を説明する前に、2つの事柄を説明します。チェーンの追加と順次化のプロセスです。
ラグ付きフィボナッチジェネレーターとも呼ばれるチェーン加算は、開始桁シーケンスを取得し、最初の2桁を運ぶことなく加算し(それらを一緒に加算しmod 10
)、結果を末尾に追加します。例えば:
79081
7 + 9 = 6
790816
9 + 0 = 9
7908169
0 + 8 = 8
79081698
8 + 1 = 9
790816989
1 + 6 = 7
7908169897
... and so on
順序付けとは、基本的に文字または数字のシーケンスを取得し、それらをアルファベット順/数字順にラベル付けすることです。重複は左から右にラベル付けされます。例えば:
E X A M P L E
0 # A
1 0 2 # Es
1 0 3 2 # L
1 0 4 3 2 # M
1 0 4 5 3 2 # P
1 6 0 4 5 3 2 # X
3 3 0 5 8 4 2 0 4 7 5 4 8 1
0 1 # 0s
0 1 2 # 1
0 3 1 2 # 2
4 5 0 3 1 2 # 3s
4 5 0 6 3 1 7 8 2 # 4s
4 5 0 9 6 3 1 7 10 8 2 # 5s
4 5 0 9 6 3 1 7 11 10 8 2 # 7
4 5 0 9 12 6 3 1 7 11 10 8 13 2 # 8s
ここではゼロインデックスを使用しますが、好きなようにインデックスを作成します。
1.中間キー
キーフレーズの最初の20文字を10個の2つのグループに分割し、それぞれ個別にシーケンシャル化S1
しS2
ます。
THEFIRSTPR
S1: 8201357946
INCIPLEIST
S2: 2603751489
ランダムな5桁のメッセージ識別子を選択しますM
(これは、必要に応じて入力の1つにすることができます)。
M = 47921
からmod 10
のキー日付の最初の5桁を、借用せずに減算(減算)します。3172016
M
M 47921
date - 31720
= 16201
10桁になるまで結果をチェーンで追加します。
1620178218
これらの数字をS1
に追加して、またはを運ばずmod 10
に取得しG
ます
1620178218
S1 + 8201357946
G = 9821425154
上記S2
で、シーケンス0123456789を記述します。シーケンス0123456789の各桁を見つけG
て、の直下の桁に置き換えS2
ます。結果はT
です。
0123456789
S2 2603751489
G 9821425154
T 9806705657
チェーンの追加を使用してT
、60桁に拡張します。
9806705657
becomes
980670565778637511245490262369939288595822106344304316978734
これらの最後の50桁は、それぞれ10桁の5行でU
ブロックを形成します。
T 9806705657
U 7863751124
5490262369
9392885958
2210634430
4316978734
最後の二つの非同等の数字U
ブロックを個別に2つの転位の幅を与えるために、エージェントの個人番号に追加、されているp
とq
。
9 + 3 = 12(p、最初の転置幅)9 + 4 = 13(q、2番目の転置幅)
SequentializeはT
の列をオフにコピーするには、この配列を使用してU
、数字の新しい行に、上から下へ、ブロックV
。
T 9806705657
seqT 9804612537
U 7863751124
5490262369
9392885958
2210634430
4316978734
V 69911 56837 12548 26533 30206 13947 72869 49804 84323 75924
最初Sequentialize p
最初の転置のためのキーを取得するために数字をK1
、および以下のq
第二のためのキーの数字をK2
。
First 12 6 9 9 1 1 5 6 8 3 7 1 2
K1 6 10 11 0 1 5 7 9 4 8 2 3
Next 13 5 4 8 2 6 5 3 3 3 0 2 0 6
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
最後に、U
ブロックの最後の行を順番に並べC
て、またがるチェッカーボードの列ヘッダーを取得します。
U5 4316978734
C 3105968724
2.チェッカーボードにまたがる
最初に、チェッカーボードの例を示し、それをそのように作成する際の原則を説明します。
3 1 0 5 9 6 8 7 2 4
S E N A T O R I
2 B D G J L P U W Y .
4 C F H K M Q V X Z #
文字の最初の行は短いキーワードSENATORI
です。キーワードには重複のない任意の文字列を使用できますが、チェッカーボードの一番上の行を定義するため、賢明に選択してください。キーワードの上はC
で、他の行は選択した任意の順序での残りのアルファベットです。私の場合、チェッカーボードにラテンアルファベットの残り、句読点.
、および数字を区別するためのマークを入れました#
。基本的に、チェッカーボードは派手な代替暗号です。たとえば、「E」はに置き換えられ1
、「W」はに置き換えられ27
ます。
このチェッカーボードでプレーンテキストメッセージをエンコードしたら、最初に、ランダムな位置で分割し、すべて大文字にすることで、メッセージの始まりを目立たなくする必要があります。他の最初の始まりを示すために、2つの完全なストップを使用します..
We are discovered. Take what you can. Burn everything else. Move to Safehouse Foxtrot 3.
になる
HING ELSE. MOVE TO SAFEHOUSE FOXTROT#3#.. WE ARE
DISCOVERED. TAKE WHAT YOU CAN. BURN EVERYT
チェッカーボードでエンコードして、以下を提供します。
407020 1293124 496481 96 354114062831 416479869443442424 271 581
2173436481812124 95451 274059 22628 435024 232880 14818229
メッセージの長さが5で割り切れない場合、メッセージを埋めるためにいくつかのヌル文字を追加します。メッセージの長さは109桁なので、「4」という1つのヌルを追加します。
40702 01293 12449 64819 63541 14062 83141 64798 69443 44242 42715
81217 34364 81812 12495 45127 40592 26284 35024 23288 01481 82294
注:私のメッセージ例には数字が含まれていないので、ここで言うように#3#
、ここでエンコードされ44344
ます。
3.最初の転置
書き替えて転置表を作成する K1
(中間キーセクションから)、続いてキーの下に同じ長さの行で前のステップからのエンコードされたメッセージをます。
K1 6 10 11 0 1 5 7 9 4 8 2 3
4 0 7 0 2 0 1 2 9 3 1 2
4 4 9 6 4 8 1 9 6 3 5 4
1 1 4 0 6 2 8 3 1 4 1 6
4 7 9 8 6 9 4 4 3 4 4 2
4 2 4 2 7 1 5 8 1 2 1 7
3 4 3 6 4 8 1 8 1 2 1 2
4 9 5 4 5 1 2 7 4 0 5 9
2 2 6 2 8 4 3 5 0 2 4 2
3 2 8 8 0 1 4 8 1 8 2 2
9 4
番号順に列を取得すると、次のようになります。
060826428 246674580 151411542 246272922 961311401 082918141
4414434239 118451234 334422028 293488758 0417249224 794943568
4. 2番目の転置
最初の転置は比較的簡単でした。ただし、これは混乱した転位です。中断パターンは、テーブルの幅とキーによって決まります。この例では、110桁と13列で構成されています。つまり、8つの行と6つの残り物があります。最初の行の入力を開始しますが、列0で停止し、次のように続行します。
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 stop at 0
2 4 6 6 7 4 5 8 0 1 continue in a triangle pattern
5 1 4 1 1 5 4 2 2 4 6
2 7 2 9 2 2 9 6 1 3 1 1
4 0 1 0 8 2 9 1 8 1 4 1 4 until the end
4 1 4 4 3 4 2 3 9 1 1 restart and stop at 1
8 4 5 1 2 3 4 3 3 4 4 2
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 restart and stop at 2
次に、最後のいくつかのスペースに残りの数字を入力します。
K2 8 7 12 2 10 9 4 5 6 0 3 1 11
0 6 0 8 2 6 4 2 8 7 2 4 9
2 4 6 6 7 4 5 8 0 1 2 2 4
5 1 4 1 1 5 4 2 2 4 6 7 9
2 7 2 9 2 2 9 6 1 3 1 1 4
4 0 1 0 8 2 9 1 8 1 4 1 4
4 1 4 4 3 4 2 3 9 1 1 9 4
8 4 5 1 2 3 4 3 3 4 4 2 3
2 0 2 8 2 9 3 4 8 8 7 5 8
0 4 1 5 6 8
ここで、最初の転置の場合とまったく同じ方法で列を読み取ります。
71431148 42711925 861904185 22614147 45499243 28261334 80218938
641701404 025244820 645224398 271283226 94944438 064214521
そして、すべてを5桁のグループに分割します。
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189
38641 70140 40252 44820 64522 43982 71283 22694 94443 80642 14521
5.メッセージを完成させる
最後のステップは47921
、メッセージ自体にランダムなメッセージ識別子を挿入することです。基準日の最後の数字は、6
グループが最後からどれだけ離れているかを示しています。
71431 14842 71192 58619 04185 22614 14745 49924 32826 13348 02189 38641
70140 40252 44820 64522 43982 47921 71283 22694 94443 80642 14521
このチャレンジの注意事項
- メッセージ、文字キーワード、キーフレーズ、日付、個人番号の5つ以上の入力が与えられます。2つの追加の入力を含めることができます:ランダムメッセージ識別子と、メッセージを埋め込むために必要なnull、または関数が独自にいくつかの乱数を生成します。
- すべての入力が有効で、正しい桁数と文字数(5桁のメッセージ識別子、キーフレーズ用に少なくとも20桁など)が有効であると想定できます。ご使用のバージョンで許可されているものを除き、文字列(メッセージとキーワード)ですべての句読点とスペースが既に削除されており、番号は既にシャープ記号で区切られていると想定できます。
- 最初のキーワードには重複した文字を含めないでください。コードでは、重複した文字を使用しないと想定できます。
- エンコードに使用する言語は、その言語が既存であり、アルファベットが既存である限り、重要ではなく、回答で使用する言語を指定します。
- 跨ぐチェッカーボードにどのアルファベットを使用しても、チェッカーボードを埋めるためにシンボルを追加または削除できます。これらの記号の使用目的を指定します(句読点、別の「メッセージ開始」記号、一般的な単語の記号など)。番号記号を完全に放棄し、番号を綴るか、チェッカーボードに各桁を含めることができます。番号記号が他の何かのためにあったスロットを使用します。回答で使用したチェッカーボードを指定してください。
- 出力は、スペースで区切られた5桁のグループの文字列、5桁の整数のリスト、または同様のものである必要があります。
0123456789
私の例では、ゼロインデックスを使用しました。使用した1234567890
ものを指定する限り、回答で1-indexingおよび、または他のシステムを使用できます。
ここでIdeone上の実装例では。
これは長い投稿であり、ほとんどを手書きで書いたので、この投稿に紛らわしい部分がある場合や、カウントと転置のエラーがある場合はお知らせください。幸運と良いゴルフ!
without borrowing
とwithout carrying
?modの加算と減算10
、つまり(6+7) mod 10 = 3
and を意味します(6-8) mod 10 = 8
か?
adding the first two digits without adding
運ぶという意味ですか?