【计算机博物志】战争密码(上集)如何复刻一台恩格玛机

02:13
这里就是密文的对称性(谁这么闲,发HelloWorld)

并不是字母replace
02:41
字母替换太土了,2000年前就有了,“现在”流行恩格玛!
n , s = int(input()) , input() for i in range(26) : print(i,end = " ") for j in s: print(end = chr((ord(j) - ord("A") + i)%26 + ord("A"))) print()
凯撒密码的暴力破解器(Py)
#include <bits/stdc++.h> using namespace std; #define ri register int int main(){ int n; string s; cin>>n>>s; for(ri i=0;i<26;i++){ cout<<i<<' '; for(ri j=0;j<n;j++)cout<<char((s[j]-65+i)%26+65); cout<<endl; } return 0; }
还有C++版本

移位替换

用随机产生403291461126605635584000000种替换表

04:30
统计法破解任意字母替换,字母中“E”“T”最高,“X”“Q”“Z”“J”最低

05:58
这里用多表替换
int table[N][26]
第i个字符s[i]加密成table[i%N][s[i]-'A']
然后发现统计学没用了
但是会MLE(OI用语,内存过高)(其实不太高,但是对于人脑太高了)


替换其实用的是转子(核心组件)
5个轮子:
电流 <- 反射轮 转轮I 转轮II 转轮III 输入轮 <- 电流


如此将电流转化为机械


随机打乱了对应的关系(随机table

)

继续随机接线
I转轮就更坑了,这就很难破解勒
11:06

11:38

这样反射会产生两次加密
自反:f(f(x)) = x
排己:f(x) ≠ x
13:00

转轮,转轮,可以转动。所以如此加密表一直在变化。
14:25

初始位置(这就是秘钥)


x转轮 -> 26^x个组合
期待下集(明年见(实际上心中:冥间见))