24、字母频率分析与维吉尼亚密码破解

字母频率分析与维吉尼亚密码破解

在密码破解的领域中,频率分析是一种非常重要的技术。本文将详细介绍如何通过频率分析来破解维吉尼亚密码,同时会深入讲解相关的Python代码实现。

维吉尼亚密码破解思路

我们采用的方法是对使用一个子密钥加密的字母进行解密,并执行频率分析,以此来确定哪个解密后的密文的字母频率与常规英语的字母频率最为匹配。简单来说,就是要找出哪个解密结果的频率匹配得分最高,这很可能意味着我们找到了正确的子密钥。

假设密钥长度为5个字母(后续会介绍如何确定密钥长度),由于维吉尼亚密码中每个子密钥有26种可能(字母表中的字母总数),所以计算机只需进行26 + 26 + 26 + 26 + 26 = 156次解密,这比尝试所有可能的子密钥组合(26 × 26 × 26 × 26 × 26 = 11,881,376次解密)要容易得多。

频率分析模块的函数

为了实现频率分析,我们需要编写一个模块,该模块包含以下几个有用的函数:
- getLetterCount() :接受一个字符串参数,返回一个字典,该字典记录了每个字母在字符串中出现的次数。
- getFrequencyOrder() :接受一个字符串参数,返回一个由26个字母组成的字符串,这些字母按照在字符串中出现的频率从高到低排列。
- englishFreqMatchScore() :接受一个字符串参数,返回一个0到12之间的整数,表示该字符串的字母频率与英语字母频率的匹配得分。

代码实现

以下是实现这些功能的Python代码:

# Frequency Finder
# https://www.nostarch.com/crackingcodes/ (BSD Licensed)

ETAOIN = 'ETAOINSHRDLCUMWFGYPBVKJXQZ'
LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

def getLetterCount(message):
    # Returns a dictionary with keys of single letters and values of the
    # count of how many times they appear in the message parameter:
    letterCount = {'A': 0, 'B': 0, 'C': 0, 'D': 0, 'E': 0, 'F': 0,
                   'G': 0, 'H': 0, 'I': 0, 'J': 0, 'K': 0, 'L': 0, 'M': 0, 'N': 0,
                   'O': 0, 'P': 0, 'Q': 0, 'R': 0, 'S': 0, 'T': 0, 'U': 0, 'V': 0,
                   'W': 0, 'X': 0, 'Y': 0, 'Z': 0}

    for letter in message.upper():
        if letter in LETTERS:
            letterCount[letter] += 1

    return letterCount

def getItemAtIndexZero(items):
    return items[0]

def getFrequencyOrder(message):
    # Returns a string of the alphabet letters arranged in order of most
    # frequently occurring in the message parameter.

    # First, get a dictionary of each letter and its frequency count:
    letterToFreq = getLetterCount(message)

    # Second, make a dictionary of each frequency count to the letter(s)
    # with that frequency:
    freqToLetter = {}
    for letter in LETTERS:
        if letterToFreq[letter] not in freqToLetter:
            freqToLetter[letterToFreq[letter]] = [letter]
        else:
            freqToLetter[letterToFreq[letter]].append(letter)

    # Third, put each list of letters in reverse "ETAOIN" order, and then
    # convert it to a string:
    for freq in freqToLetter:
        freqToLetter[freq].sort(key=ETAOIN.find, reverse=True)
        freqToLetter[freq] = ''.join(freqToLetter[freq])

    # Fourth, convert the freqToLetter dictionary to a list of
    # tuple pairs (key, value), and then sort them:
    freqPairs = list(freqToLetter.items())
    freqPairs.sort(key=getItemAtIndexZero, reverse=True)

    # Fifth, now that the letters are ordered by frequency, extract all
    # the letters for the final string:
    freqOrder = []
    for freqPair in freqPairs:
        freqOrder.append(freqPair[1])

    return ''.join(freqOrder)

def englishFreqMatchScore(message):
    # Return the number of matches that the string in the message
    # parameter has when its letter frequency is compared to English
    # letter frequency. A "match" is how many of its six most frequent
    # and six least frequent letters are among the six most frequent and
    # six least frequent letters for English.
    freqOrder = getFrequencyOrder(message)

    matchScore = 0
    # Find how many matches for the six most common letters there are:
    for commonLetter in ETAOIN[:6]:
        if commonLetter in freqOrder[:6]:
            matchScore += 1
    # Find how many matches for the six least common letters there are:
    for uncommonLetter in ETAOIN[-6:]:
        if uncommonLetter in freqOrder[-6:]:
            matchScore += 1

    return matchScore
代码解释
  1. 存储字母频率顺序

    • ETAOIN 变量存储了字母表中26个字母按出现频率从高到低的顺序: ETAOINSHRDLCUMWFGYPBVKJXQZ 。虽然并非所有英语文本都严格遵循这个频率顺序,但在大多数情况下,这个顺序已经足够准确。
    • LETTERS 变量存储了所有大写字母的字符串: ABCDEFGHIJKLMNOPQRSTUVWXYZ ,用于提供字符串字母和整数索引之间的映射。
  2. 统计消息中的字母

    • getLetterCount() 函数接受一个消息字符串,返回一个字典,字典的键是单个大写字母字符串,值是该字母在消息中出现的次数。
    • 示例代码如下:
message = """Alan Mathison Turing was a British mathematician, logician, cryptanalyst, and
computer
scientist. He was highly influential in the development of computer science,
providing a
formalisation of the concepts of "algorithm" and "computation" with the Turing
machine. Turing
is widely considered to be the father of computer science and artificial
intelligence. During
World War II, Turing worked for the Government Code and Cypher School (GCCS) at
Bletchley Park,
Britain's codebreaking centre. For a time he was head of Hut 8, the section
responsible for
German naval cryptanalysis. He devised a number of techniques for breaking German
ciphers,
including the method of the bombe, an electromechanical machine that could find
settings
for the Enigma machine. After the war he worked at the National Physical
Laboratory, where
he created one of the first designs for a stored-program computer, the ACE. In
1948 Turing
joined Max Newman's Computing Laboratory at Manchester University, where he
assisted in the
development of the Manchester computers and became interested in mathematical
biology. He wrote
a paper on the chemical basis of morphogenesis, and predicted oscillating
chemical reactions
such as the Belousov-Zhabotinsky reaction, which were first observed in the
1960s. Turing's
homosexuality resulted in a criminal prosecution in 1952, when homosexual acts
were still
illegal in the United Kingdom. He accepted treatment with female hormones
(chemical castration)
as an alternative to prison. Turing died in 1954, just over two weeks before his
42nd birthday,
from cyanide poisoning. An inquest determined that his death was suicide; his
mother and some
others believed his death was accidental. On 10 September 2009, following an
Internet campaign,
British Prime Minister Gordon Brown made an official public apology on behalf of
the British
government for "the appalling way he was treated." As of May 2012 a private
member's bill was
before the House of Lords which would grant Turing a statutory pardon if
enacted."""

letter_count = getLetterCount(message)
print(letter_count)
- 输出结果如下:
{'A': 135, 'B': 30, 'C': 74, 'D': 58, 'E': 196, 'F': 37, 'G': 39, 'H': 87,
'I': 139, 'J': 2, 'K': 8, 'L': 62, 'M': 58, 'N': 122, 'O': 113, 'P': 36,
'Q': 2, 'R': 106, 'S': 89, 'T': 140, 'U': 37, 'V': 14, 'W': 30, 'X': 3,
'Y': 21, 'Z': 1}
  1. 获取元组的第一个元素

    • getItemAtIndexZero() 函数接受一个元组作为参数,返回该元组的第一个元素。这个函数将在后续的排序操作中使用。
  2. 按频率对消息中的字母进行排序

    • getFrequencyOrder() 函数接受一个消息字符串作为参数,返回一个由26个大写字母组成的字符串,这些字母按照在消息中出现的频率从高到低排列。
    • 该函数的实现步骤如下:

      1. 统计字母频率 :调用 getLetterCount() 函数获取每个字母的频率计数。
      2. 创建频率到字母的字典 :将频率计数作为键,具有该频率的字母列表作为值。
      3. 按逆ETAOIN顺序对字母列表进行排序 :确保相同频率的字母按逆ETAOIN顺序排列,以减少频率匹配得分的偶然性。
      4. 将字典转换为元组列表并排序 :将字典转换为元组列表,并按频率计数从高到低排序。
      5. 提取最终的字母字符串 :将排序后的元组列表中的字母提取出来,组成最终的字符串。
    • 示例代码如下:

frequency_order = getFrequencyOrder(message)
print(frequency_order)
- 输出结果如下:
'ETIANORSHCLMDGFUPBWYVKXQJZ'
流程图
graph TD;
    A[开始] --> B[统计字母频率];
    B --> C[创建频率到字母的字典];
    C --> D[按逆ETAOIN顺序对字母列表进行排序];
    D --> E[将字典转换为元组列表并排序];
    E --> F[提取最终的字母字符串];
    F --> G[结束];
总结

通过以上步骤,我们实现了对消息中字母的频率分析,并按频率对字母进行了排序。这些功能将在后续的维吉尼亚密码破解中发挥重要作用。下一部分将继续介绍如何计算字母频率与英语字母频率的匹配得分,以及如何利用这些得分来破解维吉尼亚密码。

字母频率分析与维吉尼亚密码破解

计算字母频率匹配得分

englishFreqMatchScore() 函数用于计算消息字符串的字母频率与英语字母频率的匹配得分。具体来说,它会比较消息中六个最常见和六个最不常见的字母与英语中相应字母的匹配情况。

以下是该函数的详细解释:

def englishFreqMatchScore(message):
    # Return the number of matches that the string in the message
    # parameter has when its letter frequency is compared to English
    # letter frequency. A "match" is how many of its six most frequent
    # and six least frequent letters are among the six most frequent and
    # six least frequent letters for English.
    freqOrder = getFrequencyOrder(message)

    matchScore = 0
    # Find how many matches for the six most common letters there are:
    for commonLetter in ETAOIN[:6]:
        if commonLetter in freqOrder[:6]:
            matchScore += 1
    # Find how many matches for the six least common letters there are:
    for uncommonLetter in ETAOIN[-6:]:
        if uncommonLetter in freqOrder[-6:]:
            matchScore += 1

    return matchScore
  • 首先,调用 getFrequencyOrder() 函数获取消息中字母按频率排序的字符串 freqOrder
  • 然后,初始化匹配得分 matchScore 为 0。
  • 接着,遍历 ETAOIN 中前六个最常见的字母,检查它们是否在 freqOrder 的前六个字母中,如果是,则匹配得分加 1。
  • 最后,遍历 ETAOIN 中后六个最不常见的字母,检查它们是否在 freqOrder 的后六个字母中,如果是,则匹配得分加 1。

示例代码如下:

match_score = englishFreqMatchScore(message)
print(match_score)

这个得分可以帮助我们判断解密后的文本是否接近正常的英语文本,得分越高,说明越有可能是正确的解密结果。

函数调用关系总结

为了更清晰地理解各个函数之间的调用关系,我们可以用一个表格来总结:
| 函数名 | 功能 | 调用的函数 |
| ---- | ---- | ---- |
| getLetterCount() | 统计消息中每个字母的出现次数 | 无 |
| getItemAtIndexZero() | 获取元组的第一个元素 | 无 |
| getFrequencyOrder() | 按频率对消息中的字母进行排序 | getLetterCount() getItemAtIndexZero() |
| englishFreqMatchScore() | 计算字母频率与英语字母频率的匹配得分 | getFrequencyOrder() |

维吉尼亚密码破解流程

结合前面介绍的频率分析方法,我们可以总结出维吉尼亚密码的破解流程:
1. 猜测密钥长度 :这里我们先假设密钥长度为 5 个字母。
2. 对每个子密钥进行解密和频率分析
- 对使用一个子密钥加密的字母进行解密。
- 执行频率分析,确定哪个解密后的密文的字母频率与常规英语的字母频率最为匹配,即找出频率匹配得分最高的解密结果,该结果对应的子密钥可能是正确的。
3. 重复步骤 2 :对第二个、第三个、第四个和第五个子密钥重复上述过程。
4. 确定最终密钥 :根据每个子密钥的频率匹配得分,确定最终的密钥。

流程图
graph TD;
    A[猜测密钥长度] --> B[对第一个子密钥解密并分析];
    B --> C{频率匹配得分最高?};
    C -- 是 --> D[记录子密钥];
    C -- 否 --> B;
    D --> E[对下一个子密钥解密并分析];
    E --> C;
    E -- 无更多子密钥 --> F[确定最终密钥];
    F --> G[结束];
总结

通过字母频率分析,我们可以有效地破解维吉尼亚密码。首先,我们实现了几个关键的函数,包括统计字母频率、按频率排序字母和计算频率匹配得分。然后,我们介绍了维吉尼亚密码的破解流程,通过对每个子密钥进行解密和频率分析,逐步确定最终的密钥。这种方法大大减少了破解所需的计算量,提高了破解效率。在实际应用中,我们可以根据具体情况调整密钥长度的猜测方法,进一步优化破解过程。

在自媒体领域,内容生产效率作品专业水准日益成为从业者的核心关切。近期推出的Coze工作流集成方案,为内容生产者构建了一套系统化、模块化的创作支持体系。该方案通过预先设计的流程模块,贯穿选题构思、素材整理、文本撰写、视觉编排及渠道分发的完整周期,显著增强了自媒体工作的规范性产出速率。 经过多轮实践验证,这些标准化流程不仅精简了操作步骤,减少了机械性任务的比重,还借助统一的操作框架有效控制了人为失误。由此,创作者得以将主要资源集中于内容创新深度拓展,而非消耗于日常执行事务。具体而言,在选题环节,系统依据实时舆情数据受众偏好模型生成热点建议,辅助快速定位创作方向;在编辑阶段,则提供多套经过验证的版式方案视觉组件,保障内容呈现兼具美学价值阅读流畅性。 分发推广模块同样经过周密设计,整合了跨平台传播策略效果监测工具,涵盖社交网络运营、搜索排序优化、定向推送等多重手段,旨在帮助内容突破单一渠道局限,实现更广泛的受众触达。 该集成方案在提供成熟模板的同时,保留了充分的定制空间,允许用户根据自身创作特性阶段目标调整流程细节。这种“框架统一、细节可变”的设计哲学,兼顾了行业通用标准个体工作习惯,提升了工具在不同应用场景中的适应性。 从行业视角观察,此方案的问世恰逢其时,回应了自媒体专业化进程中对于流程优化工具的迫切需求。其价值不仅体现在即时的效率提升,更在于构建了一个可持续迭代的创作支持生态。通过持续吸纳用户反馈行业趋势,系统将不断演进,助力从业者保持行业发展同步,实现创作质量运营效能的双重进阶。 总体而言,这一工作流集成方案的引入,标志着自媒体创作方法向系统化、精细化方向的重要转变。它在提升作业效率的同时,通过结构化的工作方法强化了内容产出的专业度可持续性,为从业者的职业化发展提供了坚实的方法论基础。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
**项目概述** 本项目为一项获得高度评价的毕业设计成果,其核心内容为基于PythonFlask框架构建的轻量化Web应用防火墙(WAF)系统。项目资源完整,包含可运行的源代码、详尽的技术文档及配套数据资料,整体设计经过严格测试评审,具备较高的学术实践价值。 **技术特点验证** 系统采用PythonFlask框架实现,注重代码的简洁性执行效率,在保障基础防护功能的同时降低了资源消耗。项目代码已在macOS、Windows 10/11及Linux等多类主流操作系统中完成功能测试,运行稳定且符合预期目标。 **适用对象用途** 本资源适用于计算机科学技术、软件工程、人工智能、通信工程、自动化及相关专业领域的在校师生、科研人员或行业开发者。项目可作为毕业设计、课程作业、课题研究或项目原型开发的参考材料,也为初学者提供了深入理解WAF机制Flask应用开发的实践案例。使用者可根据自身需求对代码进行扩展或调整,以适配不同的应用场景。 **项目背景认可度** 该设计在毕业答辩过程中获得导师的充分肯定,评审分数达到95分,体现了其在设计完整性、技术规范性创新性方面的优势。项目资料经过系统整理,便于学习者进行复现二次开发。 **使用建议** 建议具备一定编程基础的用户参考本项目,进一步探索Web安全防护机制或进行功能拓展。项目内容注重逻辑严谨性结构清晰度,适合用于教学演示、技术研讨或个人学习。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值