密码学教材课后习题——维吉尼亚密码的破解

题目描述

已知下列密文是通过维吉尼亚密码加密得来的,试求其明文

CHREE VOAHM AERAT BIAXX WTNXB EEOPH BSBQM QEQER
BWRVX UOAKX AOSXX WEAHB WGJMM QMNKG RFVGX WTRZX
WIAKL XFPSK AUTEM NDCMG TSXMX BTUIA DNGMG PSREL
XNJEL XVRVP RTULH DNQWT WDTYG BPHXT FALJH ASVBBF
XNGLL CHRZB WELEK MSJIK NBHWR JGNMG JSGLX FEYPH
AGNRB IEQJT AMRVL CRREM NDGLX RRIMG NSNRW CHRQH
AEYEV TAQEB BIPEE WEVKA KOEWA DRWMX MTBHH CHRTK
DNVRZ CHRCL QOHPW QAIIW XNRMG WOIIF KEE

破解方法

  • Kasiski测试法

    找到重复出现次数最多的密文串,先从长度为3开始

  • 重合指数法

    根据公式I_c(x)=\dfrac{\sum_{i=0}^{i=25}f_i \times (f_i - 1)}{n \times (n - 1)} 计算重合指数

1 利用 Kasiski 测试法确认密钥的可能长度

密文串 CHR 出现四次,起始位置在 1,166, 236,286 。从第 1 个到其他 3 个的距离分别为 165, 235, 285, gcd(165, 235, 285) = 5,

所以5可能是密钥长度

# 用来保存在密文中出现次数大于等于4的长度为3的字符串
store = set()
for i in range(0, len(plaintext) - 2):
    cnt = plaintext.count(plaintext[i: i + 3])
    if cnt >= 4:
        store.add((plaintext[i: i + 3], cnt, i))
        
# 按首字母出现位置进行排序
store = sorted(store)
pos_list = [store[i][2] for i in range(len(store))]
klen = gcd(pos_list[0], pos_list[1], pos_list[2], pos_list[3])
# print(klen)   # 由 Kasiski 测试法可知密钥字的可能长度是5
2 利用重合指数法确认密钥的长度
</
d 重合指数
1 0.0455
  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值