Vigenere密码加密解密原理

原创 2017年01月03日 21:59:05

先从简单的单表代替开始说起:要知道,在CTF题中,有很多很多都是单表代替的题,比如说:

BH=CWG=EO=IEI=;DEDEDEY

所有数据长成这样,神TM能够认识对吧,但是要注意,这可是CTF的比赛!所以得分模式很套路:

最后的答案一般都是flag{}或者FLAG{}什么的对吧

那么,计算一下:

ord(‘Y’)-ord(‘}’)= - 36

那么,再试试:ord(‘B’)+36 = ord(‘f’)

所以,直接尝试一发,所以的都是36的偏移就好了,对吧

很简单的kaisamima对吧,本质上是个ascii码表的偏移对应,或者是自己定义的某些字符的循环对应

在数据文本字符情况下足够的情况下,统计英文字频即可简单破解:因为英文中的每个字符的出现概率是有固定的比例的(不是所有的都一定按照顺序,但是大概已经可以基本对应了)


那么,来谈谈什么是Virginia密码:因为单表对应很容易破解,那么换成多表呢?

所以我们确定一种对应的方法:Virginia

这种方法需要密钥,密钥的长度是单表的数量(其实是不同的字符个数)

其实,多个单表的对应关系是这样,可以一个一个算,但是,根据多个单表的思想来理解会更简单

用python代码举例会更简单吧:


import string
s = string.printable[36:62]

word = 'TOBEORNOTTOBETHATISTHEQUESTION'
cipher = 'RELATIONS'
info = ''

for i in range(0,len(word)):
	info += s[(s.find(word[i])+s.find(cipher[i%len(cipher)]))%26]
print info

flag = ''
for i in range(0,len(info)):
	flag += s[(s.find(info[i])+26-s.find(cipher[i%len(cipher)]))%26]
print flag


当然,在实际应用中并不会有这么的简单:我们不可能知道密钥是什么,甚至连密钥的长度我们也无从知道

那么,就只能根据方法来暴力测试:

kasiski测试法,来测得密钥的长度,理论是:当字符数目足够多的话,那么有可能出现,相同的字符串被相同的偏移串加密,那么得到的结果是相同的,我们把这些所有的可能全部统计下来,可以得到这些偏移值之间的相对距离。取他们的公共因子,就可能是密钥的长度

暴力的python代码如下:

def get_len(s):
	val = []
	length = len(s)
	const = 4
	for i in range(0,length-const):
		for j in range(i+1,length):
			if s[i:i+const] == s[j:j+const]:
				val.append(j-i)
	print val

其中的const越大,说明出现的概率越低,数量会越少;const越小,出现的概率越大,数量越多

我们需要取得一个适中的值,让val里大概有个10个数字左右,然后大概看下他们的公因数,一一分析,或者结合其他的方法来进行密钥长度的判断以及下一步计算

接下来就是确定密钥

相关文章推荐

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

noip2012 vigenere密码 (模拟)

P1778vigenere密码 Accepted 标签:模拟NOIP提高组2012 描述 16世纪法国外交家Blaise de ...

Vigenere密码

Vigenere密码技术: 在单字符单表替换密码中,明文中的字符与密文中字符是一一对应的(在明文表中的字符也存在于在密文表中), 明文中字符的统计特性在密文中没有得到改变。 单字符多表替...
  • only06
  • only06
  • 2017年01月30日 22:03
  • 460

[古典密码]:Vigenere cipher 维吉尼亚密码

维吉尼亚密码 Casear加密算法的升级版: 将26个Casear密表合成一个,见下表: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z A -...

Vigenere 密码破译

信息安全原理 作业1,第2题 Vignere:ktbueluegvitnthuexmonveggmrcgxptlyhhjaogchoemqchpdnetxupbqntietiabpsmaoncnwvo...

Vigenere多表加法加密分析

Vigenere多表加法加密分析
  • birdy_
  • birdy_
  • 2017年03月12日 15:16
  • 241

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数

给定A, B两个整数,不使用除法和取模运算,求A/B的商和余数。 1.   最基本的算法是,从小到大遍历: for (i = 2 to A -1)          if (i * B > A)...

利用K-means聚类算法根据经纬度坐标对中国省市进行聚类

K-means聚类算法是一种非层次聚类算法,在最小误差的基础上将数据划分了特定的类,类间利用距离作为相似度指标,两个向量之间的距离越小,其相似度就越高。程序读取全国省市经纬度坐标,然后根据经纬度坐标进...

Radon变换理论介绍与matlab实现--经验交流

本人最近在研究Radon变换,在查阅了各种资料之后在此写下个人的理解,希望与各位牛牛进行交流共同进步,也使得理解更加深刻些。 Radon变换的本质是将原来的函数做了一个空间转换,即,将原来的XY平...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Vigenere密码加密解密原理
举报原因:
原因补充:

(最多只允许输入30个字)