Vigenere加密
Vigenere加密法原理很简单,实现起来也不难。与普通的单码加密法不同,明文经过加密之后,每个字母出现的频率就不会有高峰和低峰。
密钥中字母代表行和明文中的字母代表行。在vigenere表中找到对应的字母即可。当明文的长度大于密钥的长度的时候,密钥重复使用。下面是go语言的实现版本。

vigenege表
var arr [][]int //Vigenere表
var key string = "hold" //密钥
//初始化vigenere表
func init() {
arr[][] =
for i := ; i < ; i++ {
for j := ; j < ; j++ {
arr[i][j] = 'a' + j -
}
}
for i := ; i < ; i++ {
arr[i][] = 'a' + i -
}
var num int =
for i := ; i > ; i-- {
for j := ; j < ; j++ {
arr[j][i] = 'a' + num
num++
if num% == {
num =
}
}
}
}
//进行加密
func encrypt(str string) []byte {
count :=
var ciphertext []byte = []byte(str)
length := len(key)
for i := ; i < len(str); i++ {
ciphertext[i] = byte(arr[str[i]-'a'+][key[count]-'a'+])
count++
count %= length
}
return ciphertext
}
在很长的一段时间内Vigenere加密法一直被认为是无法破解的。我们可以通过IC(index of coincidence)值来得到密钥的长度。这里还要用到MR(measure of roughness)。当所有字母都均匀分布,那么选取每个字母的概率都相同。为1/26。那么从一段密文中选取某个字母的概率与均匀分布的概率偏差为

MR就是a-z中所有的字母的偏差的和。

展开后在进行一些简单的计算可以得到

在MR中唯一依赖密文的地方就是
。其值为密文中 i 单词出现的次数与密文长度的比值。那么
和IC为


知道了IC值之后,我们可以用IC值,当IC值在0.038与0.066之间时。则表示采用了多码加密法。但我们任然无法准确的得到密钥的长度。1863年Kasiski提出了破解Vigenere的方法。当我们利用密钥加密的时候,总是重复的利用密钥进行加密,当加密后的密文中有重复的字符串则是密钥中相同的部分加密后得到的。当然,也有可能是偶然情况导致的,不过偶然情况不可能出现长串的相同字符串。因此偶然情况的影响可以消除。如下,第一段的 RUN 为密钥,中间是明文,最后为加密后的密文。
R U N R U N R U N R U N R U N R U N R U N R U N R U N
t o b e o r n o r t o b e t h a t i s t h e q u e s t
K L O V I E E I G K I O V N U R N V J N U V K H V M G
可以观察到密文中'KLOV'出现了两次,‘NU’同样也出现了两次。而重复出现的密文则表示了密钥使用的次数。因此,上述的密钥长度应为6和9的公约数。当获得足够多的密文之后,就可以得到密钥的长度。
有了密钥的长度就意味着我们可以把密文分为密钥长度个集合,且这些集合是由同个字母单码加密得到的。比如上述密文,我们得到密钥长度为3,对于密文,我们每3个一循环,那么我们可以得到3个集合
K V E K V R J V V 由R加密的集合
L I I I N N N K M 由U加密的集合
O E G O U V U H G 由N加密的集合
接下来我们可以分别破解3个由单码加密的密文,Vigenere则宣告被破解。
Vigenere加密的更多相关文章
- 【Noip2012】解题报告【字符】【贪心】【高精度】【倍增】【set】
目录:1:vigenere密码[字符]2:国王游戏[贪心][高精度]3:开车旅行[倍增][set] 题目: VJ P1778 vigenere密码 Accepted 标签:NOIP提高组2012 ...
- NOIP 2012 解决问题的方法
[D1T1vigenerepassword] P1778vigenerepassword Accepted 标签:[显示标签] 描写叙述 16世纪法国外交家Blaise de Vigenère设计了一 ...
- CTF中文件包含的一些技巧
i春秋作家:lem0n 原文来自:浅谈内存取证 0x00 前言 网络攻击内存化和网络犯罪隐遁化,使部分关键数字证据只存在于物理内存或暂存于页面交换文件中,这使得传统的基于文件系统的计算机取证不能有效应 ...
- 常见加密算法C#实现(一)
前言:最近项目中需要用到字符串加解密,遂研究了一波,发现密码学真的是博大精深,好多算法的设计都相当巧妙,学到了不少东西,在这里做个小小的总结,方便后续查阅. 文中关键词: 明文(P,Plaintext ...
- CTF中那些脑洞大开的加密(1)
0x01 目录 各种文本加密 Shell 1 2 3 4 5 6 7 8 9 10 11 12 换位加密: 1.栅栏密码(Rail-fence Cipher) ...
- CTF中那些脑洞大开的编码和加密
0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进 ...
- [加密]C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 随机练习:C#实现维吉尼亚加密与解密(解密前提为已知密匙)
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- 异或加密 - cr2-many-time-secrets(攻防世界) - 异性相吸(buuctf)
Crib dragging attack 在开始了解 Crib dragging attack 之前,先来理一理 异或. 异或加密 [详情请戳这里] XOR 加密简介 异或加密特性: ① 两个值相同时 ...
随机推荐
- 开源作业调度框架 - Quartz.NET - Cron表达式测试
昨天简单写了一下如何使用Quzrtz.NET. 那么问题来了,我设置了Cron表达式之后如何知道是表达式是否按照预期的时间执行了呢? 我找到了些Cron表达式工具生成了表达式,确发现它们基本上没有进行 ...
- 阿里八八Alpha阶段Scrum(1/12)
任务分配 叶文滔:整体框架UI设计.作为组长进行任务协调 俞鋆:后端服务器及数据库搭建 王国超:日程模块多日显示部分设计 黄梅玲:日程模块单日显示部分设计 林炜鸿:日程模块文本添加部分设计 张岳.刘晓 ...
- http-server
http-server是基于node.js的一个简单.零配置的命令行web服务器,可以方便实现跨域资源请求, #全局安装: npm install http-server -g: 全局安装后就可以通过 ...
- 原生js返回顶部(匀速、由快到慢)
在项目中我们经常有需求要求页面滚动到一定位置时出现返回顶部按钮,点击即返回顶部. 方法一: 锚点,这是最简单的.(a标签的href属性等于一直要到达位置元素的id值) 方法二: js直接给页面根节点设 ...
- 使用JFreeChart实现基于Web的柱状图
JFreeChart是一组功能强大.灵活易用的 Java绘图 API,使用它可以生成多种通用性的报表,包括柱状图.饼图.曲线图等.它能够用在 Swing和 Web等中制作自定义的图表或报表,并且得到广 ...
- 方法(method)和函数(function)的区别
函数是一段代码,通过名字来进行调用.它能将一些数据(参数)传递进去进行处理,然后返回一些数据(返回值),也可以没有返回值. 所有传递给函数的数据都是显式传递的. 方法也是一段代码,通过一个与对象相关联 ...
- BZOJ4154:[Ipsc2015]Generating Synergy(K-D Tree)
Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点染成c,或询问点a的颜色 Input 第一行一个数T,表示数据组数 接下来每组数据的第一行三 ...
- Vue入门2
欢迎转载,转载请注明出处. 前言 学习本系列Vue知识,需要结合本系列的一些demo.你可以查看我的 Github 或者直接下载 ZIP包 . 建议学习本系列之前已经会一个其他的前端框架,了解计算属性 ...
- python面试题库——3数据库和缓存
第三部分 数据库和缓存(46题) 列举常见的关系型数据库和非关系型都有那些? 关系型数据库: Oracle.DB2.Microsoft SQL Server.Microsoft Access.MySQ ...
- android中如何获取指定目录下的图片
需要对指定目录的图片文件进行列表,借鉴了网上的方法,发现列表出来是所有的文件,这样用起来很不方便,在这里也没找到解决的办法,经过自己的进一步研究终于搞定,发上来给有用的同学.用下面这种方式能实现查询实 ...