②エニグマ暗号機のローター結線解読プロジェクト(コードを書いてもらうが動かない)
イメージはマリアン・レイェフスキのローター結線解読だ。
(エニグマ暗号機のローターの中の結線。勿論、最初は秘密である。)
史実上ではフランス情報局がスパイ活動によって入手した事になっているが、マリアン・レイェフスキは時間さえかければ手作業で解読できたと言っている。どんな風にやろうと思ったのだろう?
それを私もゼロから考えてみようという試みである。
手計算ではなくてMathematicaと生成AIを使わせて貰うけど。
2024/09/23 22:10 案 まずはClaudeでこんな風に打ってみる。
(Geminiだと満足する結果が得られない)
Claudeの制限が解除されるまで時間がかかるので、今日はここまで。
しまった。今日も別の問題で使い切ってしまった…
2024/09/25
案を出してもらった👇 ので、考えてみる。
(* Import necessary packages *)
Needs["Combinatorica`"]
(* Define helper functions *)
cycleStructure[perm_] := Sort[Length /@ (Cycles[perm])];
(* Main cryptanalysis function *)
cryptanalysis[plaintext_, ciphertext_] := Module[
{n = 26, m = 6, possibleA, possibleB, consistentPairs},
(* Generate all possible permutations for A and B *)
possibleA = Permutations[Range[n]];
possibleB = Permutations[Range[n]];
(* Filter consistent pairs *)
consistentPairs = Select[
Tuples[{possibleA, possibleB}],
And @@ Table[
PermutationProduct[
#[[1]],
RotateLeft[#[[2]], i - 1]
][[ plaintext[[i]] ]] == ciphertext[[i]],
{i, 1, m}
] &
];
(* Analyze cycle structures *)
groupedA = GroupBy[consistentPairs, cycleStructure[#[[1]]] &];
groupedB = GroupBy[consistentPairs, cycleStructure[#[[2]]] &];
(* Return results *)
<|
"PossibleA" -> Keys[groupedA],
"PossibleB" -> Keys[groupedB],
"ConsistentPairs" -> Length[consistentPairs]
|>
]
(* Example usage *)
plaintext = {1, 2, 3, 4, 5, 6};
ciphertext = {15, 22, 3, 18, 9, 7};
result = cryptanalysis[plaintext, ciphertext];
Print["Possible cycle structures for A: ", result["PossibleA"]];
Print["Possible cycle structures for B: ", result["PossibleB"]];
Print["Number of consistent pairs: ", result["ConsistentPairs"]];
2024/09/28
上のプログラムは余りにも膨大なメモリを必要とするらしく、動かない。2回ほど作り直しを依頼すると、それだけでClaudeの上限制約に達してしまう。あんまり試せないな。
メモリを食い尽くすのは、おそらくこの2行だろう。
この記事が気に入ったらサポートをしてみませんか?