简述

维吉尼亚密码是在代换密码(即单表代换)基础上,衍生出来的多表代换密码。

与单表代换相同,维吉尼亚密码也采用明文字母与密钥字母(即26字母表)间建立一一对应关系。

但是不同的是,单表代换密码中一旦密钥字母确定,相同的明文就只能产生唯一的密文;

而维吉尼亚密码则是在单表的基础上,加入了密钥字,使用密钥字对明文进行分组加密,因此即使密钥(打乱的字母表)确定了,密钥字不同,也会产生不同的密文,即非固定式对应。

加解密

在之后的表述中:
<密钥>表示26字母顺序表
<密钥字>表示输入的一串辅助加密的消息序列

现假定输入的密钥字为k1到km,总长为m个字母;明文为x1到xm;表字母以初始26字母顺序表为例,进行加解密说明:

  • 加密

维吉尼亚密码的加密定义如下:

即:

  1. 将明文分成若干个分组,每个分组为m个字母长度(即密钥字的长度);
  2. 再找出分组中的字母和密钥字的字母在代换表中的对应数字;
  3. 将其对应位两两相加得出的数字,再代入代换表中,查出对应的密文字母;
  4. 将所有明文分组都如此操作,即得到密文。

加密示例:

  1. 字母表为原始A-Z
    因此00对应A,……,25对应Z

  2. 输入密钥字为Computer
    因此 m = 8,key =(02,14,12,15,20,19,04,17);

  3. 输入明文为Block cipher design principles。

将明文分为8个字母一组,再进行找序号求和取余的运算,得出序号对应的密文字母:

比如 B(序号为01),对应的密钥字为C(序号为02),相加为03,再模26得03(即D),因此明文的B对应的密文字母为 D 。

所有加密步骤图如下:

可得出密文为:Dzarevmgjsdylmxpddxhvmgnse

  • 解密

由于维吉尼亚密码也是映射型密码,因此只需要进行加密的逆过程即可解密。即:

代码示例

import reletterList = []     # 字母列表
# 初始化字母列表(此处以顺序表为例)
for i in range(ord("a"), ord("z") + 1):letterList.append(chr(i))# 加密
def encrypt():ciphertext = ""# 接收键入函数返回的列表massageAndKeyList = inputMassage()plaintextList = massageAndKeyList[0]keyList = massageAndKeyList[1]for i in range(len(plaintextList)):# 明文和密钥在表中的对应数值plaIndex = letterList.index(plaintextList[i])keyIndex = letterList.index(keyList[i % len(keyList)])# 做加法后区取余运算ciphertext += letterList[(plaIndex + keyIndex) % 26]return ciphertext# 解密(加密的逆过程)
def decrypt():plaintext = ""# 接收键入函数返回的列表massageAndKeyList = inputMassage()ciphertextList = massageAndKeyList[0]keyList = massageAndKeyList[1]for i in range(len(ciphertextList)):# 密文和密钥在表中的对应数值cipIndex = letterList.index(ciphertextList[i])keyIndex = letterList.index(keyList[i % len(keyList)])# 取余运算plaintext += letterList[(cipIndex - keyIndex) % 26]return plaintext# 键入
def inputMassage():massageList = []  # 消息序列keyList = []    # 密钥序列# 输入消息并创建消息序列massage = (re.sub("[^a-zA-Z]", "", input("Input text:"))).lower()for i in massage:massageList.append(i)# 输入密钥并创建密钥序列key = (re.sub("[^a-zA-Z]", "", input("Input key:"))).lower()for i in key:keyList.append(i)# 以列表形式返回输入的消息序列和密钥序列return [massageList, keyList]if __name__ == "__main__":while True:print("1、Encrypt    2、Decrypt   3、Show Form")choice = int(input("Please choose(Input number):"))if choice == 1:ciphertext = encrypt()print("ciphertext:", ciphertext)elif choice == 2:plaintext = decrypt()print("plaintext:", plaintext)elif choice == 3:print("The Form Of This Operation:\n", letterList)else:print("Input error!")

输入示例

  • 对以上示例进行验证

输入明文:Block cipher design principles

输入密钥字:Computer

加密结果:dzarevmgjsdsylmxpddxhvmgnse

再对其解密

解密结果与输入的明文相同。

  • 验证密钥字的作用

依然对以上明文进行加密:Block cipher design principles

输入不同的密钥字:XiaoheiBryant

加密结果:ytoqrgqqycrqxpqgbwvqotgpyxp

可见,相同的明文,相同的字母表,但是密钥字不同,加密结果依然不同。

同理,明文相同,密钥字相同,当字母表变换时,加密结果依然不同。

总结

作为多表代换加密,维吉尼亚密码可以很好的抗击频率分析攻击法,再该加密算法下,字母的频率特性会消失。

一般而言,在大量分析后,英文字母的出现频率是与一个高低排序的,因此在单表代换密码(如代换密码)中,可以根据密文中的字母出现频率,来判断其对应的明文字母。

那么维吉尼亚密码这么好用,为什么还是放弃了呢?

由于维吉尼亚密码依然属于代换密码,而且是凯撒密码的26中移位:

因此,还是可以根据频率分析的方法进行破解的。

  • 破解

破解维吉尼亚密码的关键在于计算出密钥字的长度

可以采用重复子串偏移量的最大公约数,来求出密钥字的长度

由于其加密是根据密钥字的长度进行分组加密,因此当破解出密钥字的长度后,加密算法就是一个多重凯撒密码,再根据频率分析就能得出对应明文。

  • 震惊

该加密方法是在16世纪(约500年前)提出的!

仅作为学习整理,若有问题请指出

古典密码之“维吉尼亚密码”相关推荐

  1. python 古典密码第一弹(凯撒密码,Playfair密码,维吉尼亚密码)

    各位白嫖-漂亮大哥哥姐姐们好,在下菜鸡一枚,主要想在这和大家一起探讨学习之道,一起愉快的学习密码学基础.总所周知,密码学学的好,头发掉的少... 直接进入正题,今天我就主要讲三个密码,而且都是古典密码 ...

  2. Vigenere密码(维吉尼亚密码)c语言实现

    Vigenere密码(维吉尼亚密码)c语言实现 简介 Vigenere密码是基于关键词的加密系统. 算法解释 Vigenere密码技术使用一个词组作为密钥,词组中的每一个字母都作为移位替换密码的密钥并 ...

  3. 古典密码之维吉尼亚密码实验

    学习目标: 维吉尼亚密码是古典密码中非常具有代表的例子.本实验要求用高级语言编写和调试一个简单的维吉尼亚密码实现及解密程序,通过本实验可以加深理解维吉尼亚密码原理. 预备知识: 人们在单一恺撒密码的基 ...

  4. 密码学(二):古典密码之维吉尼亚密码的破解

    维吉尼亚密码的破解 一.引言   上一章我们介绍了维吉尼亚密码的原理,是通过移位替换的加密方法进行加密,但是因为概率论的出现这种简单的移位或替换就容易破解了,其原理很简单,英文中字母出现的频率是不一样 ...

  5. Java实现凯撒密码、维吉尼亚密码、双换位密码、RC4算法加密

    文章目录 前言 一.凯撒密码 二.维吉尼亚密码 三.双换位密码 四.RC4算法加密 前言 本博文为信息安全与支付课程的课程作业. 一.凯撒密码 文件有:Caesar.java.输入文件input1.t ...

  6. MTALAB实现多表代替密码(维吉尼亚密码)

    维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式. 设d为一固定的正整数,d个位移代换表π=(π1,π2,-,πd),由密钥序列K=(k1,k2 ...

  7. 古典密码之维吉尼亚密码破解思路

    首先要说一句,这是我第一次用python coding,所以很多地方都不太懂,吐槽自己竟然用sum当变量名,之后有用sum()函数,然后报了错还不知道为什么.不知道用ascii码要做chr()转化,等 ...

  8. java维吉尼亚密码_维吉尼亚密码java完整版

    package cn.longxuzi; import org.junit.Test; public class Chi_SquareUtils { private static final ICUt ...

  9. 古典密码(单表密码,维吉尼亚密码,普莱费尔密码,一次一密)

    古典密码 1.单表密码(仿射加密) 仿射加密变化是:y=ax+b 算法: 仿射密码是一种表单代换密码,字母表的每个字母相应的值使用一个简单的数学函数对应一个数值,再把对应数值转换成字母. A B C ...

最新文章

  1. react中context到底是如何传递的-源码分析
  2. 宿迁中学高考2021成绩查询,2020宿迁市地区高考成绩排名查询,宿迁市高考各高中成绩喜报榜单...
  3. spring boot发送普通文本邮件/HTML邮件/附件邮件/图片邮件完整代码
  4. 阅读Java_如何阅读 Java 开源代码?
  5. Spring Cloud Alibaba Nacos 的 2 种健康检查机制!
  6. [CSAcademy]Cycle Tree
  7. 史上最惨创始人!250亿帝国如今8亿贱卖,还被兄弟亲手送进了监狱
  8. pycharm创建django项目界面解释
  9. 淘宝云梯分布式计算平台架构
  10. c语言求信源的信息熵,第二章-信源与信息熵(三)
  11. 国内外sns源码搜集
  12. 动作捕捉系统FOHEART·MAGIC
  13. mysql 游戏背包_01背包问题(完全背包,部分背包)golang实现
  14. ArcGIS超级工具目录
  15. python3GUI--微博图片爬取工具V1.5(附源码)
  16. 机器视觉(4)-- 云台人脸追踪
  17. 转--2014年最新810多套android源码2.46GB免费一次性打包下载
  18. STL(五)之智能指针剖析
  19. 企业该如何用短信推广
  20. 乐博Android客户端(新浪微博)1.01发布,欢迎各位童鞋试用

热门文章

  1. KD2511N系列微电阻测试仪
  2. STM32共用中断和共用中断函数的判断
  3. C++ vector常用函数总结
  4. 汇编编写的英文打字练习软件
  5. IC-14W网络IC卡读写器_银河麒麟桌面操作系统V10适配测试报告
  6. qW3xT.5 记一次解决挖矿病毒
  7. 微型计算机系统概述,第1章微型计算机系统概述
  8. Motor-DK (MM32SPIN05PF, MM32SPIN06PF, MM32SPIN07PF)
  9. C++ ShellExecuteEx 调用exe 文件传参
  10. css嵌入样式元素,css伪元素怎么用在内嵌样式?