密码学之单表密码 python实现及密码分析

单表密码在凯撒密码之上做了改进(对密钥进行置换),原理较为简单。

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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值