题目来源:
密码学原理与实践(第三版) 冯登国 1.21(b) 及1.24
维吉尼亚密码.py
# -*- coding: utf-8 -*-
'''
代码中各个函数的说明如下
gcd(a, b) #获取两个数的最大公因数
multi_gcd(num) #获取数组中所有数的最大公因数
find_substr(strs) #统计字符串中长度为2的子串出现的次数
cal_pos(substr, strs, count) #计算字符串中,子串出现位置的距离差
cal_frequency(strs) #统计字符串中,英文字符出现的频率,并计算出 M_n
str_offset(strs, n) #将字符串中的所有英文字符整体向左偏移n位
crack(strs, m) #计算密钥和明文的主体函数
'''
import operator
from functools import reduce
strs = "KCCPKBGUFDPHQTYAVINRRTMVGRKDNBVF\
DETDGILTXRGUDDKOTFMBPVGEGLTGCKQRACQCWDN\
AWCRXIZAKFTLEWRPTYCQKYVXCHKFTPONCQQRHJV\
AJUWETMCMSPKQDYHJVDAHCTRLSVSKCGCZQQDZXGS\
FRLSWCWSJTBHAFSIASPRJAHKJRJUMV