题目描述
已知下列密文是通过维吉尼亚密码加密得来的,试求其明文
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 | </