Tamevic's Ctf-Crypto writeup@实验一"维吉尼亚密码的实现和破解"

这篇博客详细介绍了维吉尼亚密码的原理及其在CTF挑战中的应用。作者分析了维吉尼亚密码的加密策略,指出其复杂度在于密钥的长度和内容。破解思路依赖于拟合指数(CI)来比较密文与正常英文的统计特性。通过尝试不同密钥长度和对比CI值,最终成功破解并验证了加密解密过程。这展示了古典密码的弱点,并强调了统计特性在密码学中的重要性。
摘要由CSDN通过智能技术生成

Tamevic’s Ctf-Crypto writeup@实验一"维吉尼亚密码的实现和破解"

应用密码学的第一个实验

分析

首先 关于维吉尼亚密码(Vigenere):

它是凯撒加密的一种升级版本,即明文的每一位都是用凯撒加密(移位),但所用的密钥(移动位数)却不是相同的。在实现的过程中需要考虑加密策略,主要是对空格和标点符号的处理。(遇到标点符号和空格时密钥是否跟着移一位。如“hello world”“nihao”加密,如果遇到非字母时密钥也跳一位的情况下密文为“umslc jwylr”,而不跳一位的情况下密文为“umslc evrzq”)我们这里加密的时候使用的策略是遇到非字母字符密钥不往后顺延。

这样来看的话,对于攻击者来说复杂度就变为了两层,一层是密钥的长度,一层是密钥的内容。

其次 关于破解思路:

古典密码的一个最重要的问题在于没有办法隐蔽文章的统计特性,维吉尼亚密码也未能避免这个问题。所以拿到一串密文,根据之前分析到的两层结构,进行试验性爆破。

这里用到的主要是拟重合指数(CI)进行试验。
在这里插入图片描述在这里插入图片描述CI指随机取出两个字符相同的概率

在一段正常的英文原文中CI的值是用所有的字母频率带入计算
在这里插入图片描述CI≈0.065

通过和英文CI相比对,越接近这个值证明字母特性越符合英文原文。

破解时:
先猜测密钥长度,根据密钥长度对密文进行分组,把每一组中处于相同位置的密文放在一个分组里,这样一个分组内的密文都是用一个密钥进行加密的,他们的密文也会符合英文原文的重合指数。对一定范围内的密钥长度进行暴破,和CI值进行比对,求得最有可能的密钥长度。
再根据求得的密钥长度对密文进行分组,对每个分组的密钥进行暴破,具体思路和猜测密钥长度一致。看哪个密钥下重合指数比较符合英文原文,那么那个分组的密钥就是那个密钥。

最后再解密验证。

结果

加解密实现

# coding: utf-8
def encrypt(message,key):
    cipher=''
    j=0
    for i in range (len(message)):
        
        if key[j % len(key)].islower():
            offset = ord(key[j % len(key)]) - ord('a') 
        else:
            if key[j % len(key)].isupper():
                offset = ord(key[j % len(key)]) - ord('A') 
            else:
                offset = ord(key[j % len(key)]) - 48

        j+=1

        if message[i].isalpha():
            if message[i].islower():
                cipher += chr((ord(message[i]) - ord('a') + offset )%26 +ord('a'))       
            else:
                cipher += chr((ord(message[i]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值