【密码学】破解维吉尼亚密码(C++代码实现)

2023-11-19

问题简述

维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。

在一个凯撒密码中,字母表中的每一字母都会作一定的偏移,例如偏移量为3时,A就转换为了D、B转换为了E……而维吉尼亚密码则是由一些偏移量不同的凯撒密码组成。

为了生成密码,需要使用表格法。这一表格(如图所示)包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。

例如,假设明文为:

ATTACKATDAWN

选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:

LEMONLEMONLE

对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到:

明文:ATTACKATDAWN密钥:LEMONLEMONLE密文:LXFOPVEFRNHR

解密的过程则与加密相反。例如:根据密钥第一个字母L所对应的L行字母表,发现密文第一个字母L位于A列,因而明文第一个字母为A。密钥第二个字母E对应E行字母表,而密文第二个字母X位于此行T列,因而明文第二个字母为T。以此类推便可得到明文。

用数字0-25代替字母A-Z,维吉尼亚密码的加密文法可以写成同余的形式:

解密方法则能写成:

维吉尼亚由于其加密的复杂性和密钥的不确定性曾经一度被称为“不可破解的密码”。

破解实现

我选择的破解方法是重合指数法。

①我们先编写一个能把密文按照某个步长进行分组的函数makeGroup(),参数beforeText为密文内容,参数step为分组的步长。

1.	string* makeGroup(string beforeText, int step) {  
2.	    string* afterText = new string[step];  
3.	    long length = beforeText.length();  
4.	    for (long i = 0; i < length; i++) {  
5.	        afterText[i % step] += beforeText[i];  
6.	    }  
7.	    return afterText;  
8.	};  

②接下来我们就可以开始实质的第一步,那就是先推测密钥的长度,我们按照不同步长对密文进行分组,随后计算出对应的重合指数(公式如下)并打印到控制台。

 

//求密钥长度,根据不同密钥长度对应的重合指数,正常文本为0.0635左右
int GetKeyLength(string cipherText) {
	//尝试1-30的密钥长度
	double smallest = 1;
	int keyLength = 0;
	for (int i = 1; i < 30; i++) {
		double index = 0;
		string* afterText = makeGroup(cipherText, i);
		for (int j = 0; j < i; j++) {
			double num = 0;
			//ASCII码97-122对应a-z
			for (int p = 97; p < 123; p++) {
				int count = 0;
				for (int q = 0; q < afterText[j].length(); q++) {
					if (afterText[j][q] == p) {
						count++;
					}
				}
				num += (double(count) / afterText[j].length()) * ((double(count) - 1) / (afterText[j].length() - 1));
			}
			index += num;
		}
		cout <<"密钥长度为"<<i<<"时,重合指数="<< index / i << endl;
	}
	return keyLength;
}

运行该函数即可得到如下:

所以经过分析,密钥的长度应该是8的倍数。

③接下来我们需要将推测的密钥长度代入,按照推测的密钥长度对明文分组,对每组的字母进行频率分析,进而得到该密钥长度对应的密钥。

//频率分析,确定e对应的密钥
string frequencyCount(string cipherText, int step) {
	string* afterText = makeGroup(cipherText, step);
	string key;
	for (int i = 0; i < step; i++) {
		//ASCII码97-122对应a-z
		int E = 97;
		double max = 0;
		for (int j = 97; j < 123; j++) {
			int count = 0;
			for (int k = 0; k < afterText[i].length(); k++) {
				if (afterText[i][k] == j) {
					count++;
				}
			}
			cout << char(j) << "的频率=" << double(100 * count) / afterText[i].length() << endl;
			if ((double(100 * count) / afterText[i].length()) > max) {
				max = (double(100 * count) / afterText[i].length());
				E = j;
			}
		}
		key += char(E);
	}
	return key;
}

 

控制台得到的输出如下,我们找到频率最高的两个或者三个,它们很有可能就是密钥中e对应的字母。

可知e最有可能变成了p或t,通过查表逆推得到对应的密钥字母为L或者P,保险起见两种可能在解密时都要试一试。

当然,我们还可以把查表这个过程变成程序来实现,简单高效,避免查表的繁琐。

//获取密钥
string GetKey(string cipherText, int keyLength) {
	string key = frequencyCount(cipherText, keyLength);
	for (int i = 0; i < key.length(); i++) {
		key[i] = (key[i] - 101 + 26) % 26 + 'a';
	}
	cout << "根据频率分析法密钥最可能为:" << key << endl;
	return key;
}

通过这种方法我们得到了密钥的几种可能的形式,如lagrange、lagrwnve等等,其实现在就可以猜测密钥大概率就是lagrange,因为只有lagrange有实际意义。

④既然得到了密钥,下一步就是解密了,解密的方法就是按照密钥长度对密文进行分组,然后按照对应的密钥字进行查表逆推即可,我们还是把它写成了程序。

//密文解密,参数key为密钥
void decrypt(string cipherText, string key) {
	//分组
	string* afterText = makeGroup(cipherText, key.length());
	//对照密码表倒推替换
	for (int i = 0; i < key.length(); i++) {
		for (int j = 0; j < afterText[i].length(); j++) {
			afterText[i][j] = (afterText[i][j] - key[i] + 26) % 26 + 'a';
		}
	}
	//组装明文内容
	string plainText;
	for (int j = 0; j < afterText[0].length(); j++) {
		for (int i = 0; i < key.length() && j < afterText[i].length(); i++) {
			plainText += afterText[i][j];
		}
	}
	cout << plainText << endl;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【密码学】破解维吉尼亚密码(C++代码实现) 的相关文章

  • 2、隐私计算--安全多方计算

    目录 安全多方计算 安全多方计算的技术架构 安全挑战敌手模型 安全多方计算关键技术 安全多方计算主要特点 安全多方计算应用 安全多方计算与区块链 JUGO平台 参考 https blog csdn net w365904 article d
  • 密码学之公钥密码体系(2):RSA算法

    密码学之公钥密码体系 2 RSA算法 文章目录 一 RSA算法背景 二 RSA算法描述 三 RSA的硬件实现 四 RSA的安全性 五 对RSA的选择密文攻击 一 RSA算法背景 上一讲介绍了公钥密码体系中的背包算法 在Merkle背包算法出
  • RSA算法Java版(不要求支持大数)但实现了(dog

    RSA算法 支持大数 题目描述 C 中数据的类型与长度参考 因此 C 最大能支持的十进制是19位的整数 如果要支持更大的整数 需要实现Big Number类 RSA目前比较安全的密钥长度是2048位二进制 即是617位的十进制 因此 C 自
  • 斯坦福密码学课程-笔记-02-Stream Ciphers流密码

    斯坦福密码学课程笔记 02 流密码 Stream Ciphers The One Time Pad Symmetric Ciphers definition The One Time Pad Vernam 1917 Information
  • 《A Graduate Course in Applied Cryptography》Chapter 18 Protocols for identification and login(1)

    原文教材 与 参考资料 Boneh Dan Shoup Victor A Graduate Course in Applied Cryptography J 该书项目地址 可以免费获取 http toc cryptobook us 博客为对
  • 11 种加密 & 哈希算法的原理及其 Java 实现

    11 种加密 哈希算法的原理及其 Java 实现 一 目的 二 运行环境 三 基本原理及步骤 I 各种加密算法的原理 DES 数据加密标准 Data Encryption Standard 算法介绍 算法流程 优点 缺点 破解方式 适用场景
  • cryptographic primitives(密码学原语 )

    hash commitment Pedersen承诺
  • 现代密码学第三次实验:不对称加密算法RSA

    现代密码学第三次实验 不对称加密算法RSA 前言 一 实验目的 二 实验环境 三 实验步骤 四 实验基本方法 五 实验程序清单 七 实验结果 八 实验总结 前言 为了帮助同学们完成痛苦的实验课程设计 本作者将其作出的实验结果及代码贴至CSD
  • 密码学技术在区块链系统中的应用

    密码学技术是区块链数据核心技术 P2P网络协议 共识机制 密码学技术 账户与存储模型 中核心的技术点 区块链主要用到的密码算法有哈希算法和加密算法 加密又包括对称性加密和非对称性加密两个概念 区块链系统里面一般常用到的是非对称加密 本文首先
  • 【总结一】现代密码学

    目录 1 密码学概述 1 1 密码学的基本概念 1 1 1 为什么要学密码学 1 1 2 什么是密码学 1 1 2 密码算法的基本模型 1 1 3 密码算法的分类 1 2 密码分析学 1 3 古典密码算法 1 3 1 置换密码 1 3 2
  • Windows 下PBC库的安装和配置

    背景 PBC库是一个基于双线性对的密码学库 这库在公钥密码学中使用非常广泛 这个库在Linux下的安装非常的简单 有些只会纸上谈兵的人需要在WIN下做 呵呵 但是没办法 需求到了 硬着头皮也要写完 对于一些只会谈兵的人 呵呵 现在主要介绍下
  • 密码学研究重点

    密码学涵盖了认证 数字签名以及更多基本的安全功能 密码学涉及领域及其宽广 包括计算机安全 高等数学 经济学 量子物理学 民法和刑法 统计学 芯片设计 软件优化 政治 用户界面设计等 0x01 密码学重要性 密码学本身没有价值 必须作为一个系
  • EIGamal数字签名的实现(c++)——大三密码学实验

    实验原理 1 密钥产生 Alice要对一个消息签名 她选择一个大素数p和一个本原根g 选择一个秘密整数 并且计算 p g y 公开 x秘密保存 注 EIGamal签名方案的安全性在于x的保密性 由于离散对数学问题难解 很难由 p g y 确
  • SM2公钥加密

    文章目录 简介 推荐参数 1 前置条件 1 1 点到字符串的转换 压缩 未压缩 混合形式 1 2 密钥派生函数 6 加解密 加密流程 解密流程 实现 参考资料 简介 国密SM2算法并不仅仅是提供了新的曲线参数 而是在算法上对ECC进行了修改
  • [Cryptography]1.对称密钥和非对称密钥 2.计算modulo inverse 3.计算possible key

    对称密钥和非对称密钥 对称密钥顾名思义就是两个end users使用同一个key Secret Key来进行加密解密 最大的问题就是如何安全的传输SK给另一方 非对称密钥就是说每个人都拥有一个public key和一个private key
  • 基础密码学知识和python pycrypto库的介绍使用

    一 密码学基础概念 1 密码 对文本进行编码 使偷窥者无法识别的算法 是一套编码方案 一种特殊的报文编码和相应的解码方式的结合体 加密之前的原始报文称为明文 使用密码之后的报文叫密文 一个简单的例子 这个例子是著名的三字符循环移位密码rot
  • 最安全的加密算法

    在密码学里 有一种理想的加密方案 叫做一次一密乱码本 one time pad one time pad的算法有以下要求 1 密钥必须随机产生2 密钥不能重复使用3 密钥和密文的长度是一样的 one time pad是最安全的加密算法 双方
  • 实验吧-密码学-奇怪的短信(九键密码)

    短信里的一段密文 335321414374744361715332 一般来说是用手机接收短信的 于是可能是手机上的九键 将密文两个两个分隔开 33 53 21 41 43 74 74 43 61 71 53 32 然后对应着拼音九键来找出对
  • 【区块链与密码学】第6-7讲:SM9数字签名算法

    本课堂内容全部选编自PlatON首席密码学家 武汉大学国家网络安全学院教授 博士生导师何德彪教授的 区块链与密码学 授课讲义 教材及互联网 版权归属其原作者所有 如有侵权请立即与我们联系 我们将及时处理 6 7 SM9数字签名算法 为了降低
  • CTF BugKu平台——Crypto篇刷题记录(后续更新)

    CTF BugKu平台 Crypto篇 前言 抄错的字符 聪明的小羊 ok lt gt 把猪困在猪圈里 你喜欢下棋吗 小山丘的秘密 EN 气泡 你以为是md5吗 Math English easy crypto 黄道十二官 一段新闻 7 1

随机推荐