单表密码在凯撒密码之上做了改进(对密钥进行置换),原理较为简单。
plaintext = input('明文:')
key = input('密钥:')
plaintext = plaintext.replace(" ", "")
plaintexts = []
keys = []
for p in plaintext:
if ord('A') <= ord(p) <= ord('Z') or ord('a') <= ord(p) <= ord('z'):
p = p.upper()
plaintexts.append(p)
for k in key:
k = k.upper()
keys.append(k)
ciphertexts = []
for i in range(len(plaintexts)):
c = ord(plaintexts[i])
c = keys[c-ord('A')]
ciphertexts.append(c)ciphertexts=''.join(ciphertexts)
print('密文:'+ ciphertexts)
运行结果:
密钥必须为26个字母的一个排列(置换)!
密码分析也较为简单,以下只简短的列几点:
对密文:ITVOSSAOSSNGXQZDGKOHXWVOZIQUXFQFRQLIQKAAFOYTVQKFOFUYGKZXFQZTSNZITKTOLQVTQHGFZIQZEQFLXHHGKZNGXXFRTKZITIGFUNOFUWKORUTYOFROZQFRXLTOZZGATTHNGXKLTSYLQYTNGXIQCTZGSOCTZIKGXUIZIOLRQN
进行统计分析:
密文字母 | 出现次数 | 出现频率 |
T | 16 | 0.091954 |
Q | 15 | 0.086207 |
Z | 15 | 0.086207 |
O | 14 | 0.08046 |
F | 13 | 0.074713 |
G | 12 | 0.068966 |
I | 11 | 0.063218 |
X | 11 | 0.063218 |
K | 10 | 0.057471 |
L | 7 | 0.04023 |
N | 7 | 0.04023 |
S | 7 | 0.04023 |
R | 6 | 0.034483 |
U | 6 | 0.034483 |
H | 5 | 0.028736 |
Y | 5 | 0.028736 |
A | 4 | 0.022989 |
V | 4 | 0.022989 |
C | 2 | 0.011494 |
W | 2 | 0.011494 |
D | 1 | 0.005747 |
E | 1 | 0.005747 |
B | 0 | 0 |
J | 0 | 0 |
M | 0 | 0 |
P | 0 | 0 |
总数 | 174 | 1 |
因此出现频率最高的字母T和Q、Z可能相当于明文中的e和t
出现频率较高的Q、Z、O、F、G、I、X可能相当于明文中的a,h,i,n,o,r,s
频率较低的C、W、D、E、B、J、M、P可能相当于明文中的b、j、k、q、v、x、z
ZI组合出现次数较多,出现了6次,因此ZI有很大概率为th