凯撒密码的自动化破解方法(适用于英文文本)

凯撒密码

凯撒加密是有记载的最古老的加密方法。原始的凯撒密码没有密钥,加密方式很原始,就是通过将字母表循环右移三位进行加密:a被D替代,b被E替代,…,x被A替代,y被B替代,z被C替代。
我们现在引入密钥。将字母表看作数字{0,1,2,…,25}(而不是英文字符),密钥k是一个0到25直接的数。加密算法使用密钥k将英文字母组成的明文的每个字母向后移动k个位置,解密算法使用相同的密钥k将密文的每个字母向前移动k个位置。

数学化的描述如下:

  • 明文空间M = 密文空间C = {0,1,2,..,25}
  • 密钥空间K = {0,1,2,…,25}
  • 加密算法Enc: c = (m+k) mod 26
  • 解密算法Dec: m = (c - k) mod 26

下面给出加解密的C代码实现

//加密算法,密钥key 明文文件src_file 生成密文文件des_file
void enc(const char des_file[], const char src_file[], int key)
{FILE *fin = fopen(src_file, "r");FILE *fout = fopen(des_file, "w");char ch, tem;while ((ch = fgetc(fin)) != EOF) {tem = tolower(ch);tem = 'a' + (tem-'a'+key) % 26;if (islower(ch)) ch = tem;else if (isupper(ch)) ch = toupper(tem);fputc(ch, fout);}fclose(fin);fclose(fout);
}
//解密算法,密钥key 密文文件src_file 生成原文件des_file
void dec(const char des_file[], const char src_file[], int key)
{FILE *fin = fopen(src_file, "r");FILE *fout = fopen(des_file, "w");char ch, tem;while ((ch = fgetc(fin)) != EOF) {tem = tolower(ch);tem = 'a' + (tem-'a'+26-key) % 26;if (islower(ch)) ch = tem;else if (isupper(ch)) ch = toupper(tem);fputc(ch, fout);}fclose(fin);fclose(fout);
}

朴素的穷举攻击方法

由于凯撒密码的密钥量太小了,只有26个可能的密钥,因而非常容易尝试每个密钥,并观察哪个密钥解密密文后得到的明文“有意义”。这种方法的缺点就是很难自动进行,因为对于计算机而言查看明文是否“有意义”比较困难(也并非不可能,比如通过查看包含有效英文单词的字典来完成)。有些情况下,明文字符符合英文文本的分布规律,但是明文本身不是有效的英文文本,这使得问题变得更加困难。

结合频度分析的自动化攻击

凯撒密码中每个字符的映射是固定的,因此如果字母a映射到D,那么每次a在明文中出现的时候,都会导致字母D在密文中出现。英语中单个字母的概率分布是已知的,不同的字母在不同文本中的平均出现频率通常是一样的,文本越长,频率计算就越接近平均值。但是,即使是相对较短的文本(仅有几十个字)已经足够接近平均值的分布了。

下面给出频率分布表(存放在double数组中)

#define LIST_LEN 26const double p[LIST_LEN] = {0.082,0.015,0.028,0.042,0.127,0.022,0.02, 0.061,0.07, 0.001,0.008,0.04, 0.024,0.067,0.075,0.019,0.001,0.06, 0.063,0.09,0.028,0.01, 0.024,0.02, 0.001,0.001};

用0到25的数字表示英文字母。令pi(0<= i < 26)表示普通英文文本中字母i出现的概率,对已知的值pi容易计算

∑i=025p2i≈0.065379

\sum_{i=0}^{25} p_i^2 \approx 0.065379

现在给定一些密文,并令qi表示第i个字母在密文中的频率(qi是第i个字符出现的次数除以密文的长度)。如果密钥是k,那么期望对于每个i,qi+k约等于pi(这里用i+k代替(i+k)mod26)
对于每个j从0到25

Ij=∑i=025piqi+j≈0.065379

I_j = \sum_{i=0}^{25} p_iq_{i+j} \approx 0.065379

如果发现Ik约等于0.065379,这里k就是密钥。这样,密钥恢复攻击非常容易自动进行:对于所有j计算Ij,并输出所有Ik接近0.065379的k。

攻击代码如下:

#define TARGET 0.065379
#define LIST_LEN 26const double p[LIST_LEN] = {0.082,0.015,0.028,0.042,0.127,0.022,0.02, 0.061,0.07, 0.001,0.008,0.04, 0.024,0.067,0.075,0.019,0.001,0.06, 0.063,0.09,0.028,0.01, 0.024,0.02, 0.001,0.001};/*统计filename中字母出现频率,存放在数组q中*/
void count(const char filename[], double q[LIST_LEN])
{int i, len = 0;   /* len 为字母总个数约等于密文长度*/FILE *fin = fopen(filename, "r");char ch;for (i = 0; i < LIST_LEN; i++) q[i] = 0;while ((ch = fgetc(fin)) != EOF) {if (isalpha(ch)) {len++;ch = tolower(ch);q[ch-'a'] += 1;}}fclose(fin);for (i = 0; i < LIST_LEN; i++) q[i] /= len;
}
/*破解密钥key,其中数组q存放密文字母出现频率*/
int analysis(const char filename[], double q[LIST_LEN])
{int i, j, key = 0;double eps = 1;  /* eps 存储与TARGET最小差值*/count(filename, q);for (j = 0; j < LIST_LEN; j++) { /*变量j穷举密钥*/double sum = 0, tem;for (i = 0; i < LIST_LEN; i++) {/* 求sum{p[i]*q[i+j]}之和 */int t = (i+j) % 26;sum += p[i] * q[t];}tem = fabs(sum-TARGET);if (tem < eps) {eps = tem; key = j;}}return key;
}

演示

使用密钥k=14,加密如下英文文本:Q is a symmmetric block cipher. It is defined for a block size of 128 bits. It allows arbitrary length passwords. The design is fairly conservative. It consists of a simple substitution-permutation network. In this paper we present the cipher, its design criteria and our analysis. The design is based on both Rjindael and Serpent. It uses an 8-bit s-box from Rijndael with the linear mixing layers replaced with two Serpent style bit-slice s-boxs and a linear permutation. The combination of methods eliminates the high level strcuture inherent in Rjindael while having better speed and avalanche characteristics than Serpent. Speed is improved over Serpent. This version 2.00 contains better analysis, editorial changes, and an improved key scheduling algorithm. The number of recommended rounds is also increased.

密文为:E wg o gmaaashfwq pzcqy qwdvsf. Wh wg rstwbsr tcf o pzcqy gwns ct 128 pwhg. Who zzckg ofpwhfofm zsbuhv doggkcfrg. Hvs rsgwub wg towfzm qcbgsfjohwjs. Wh qcbgwghg ct o gwadzs gipghwhihwcb-dsfaihohwcb bshkcfy. Wb hvwg dodsf ks dfsgsbh hvs qwdvsf, whg rsgwub qfwhsfwo obr cif obozmgwg. Hvs rsgwub wg pogsr cb pchv Fxwbrosz obr Gsfdsbh. Wh igsg ob 8-pwh g-pcl tfca Fwxbrosz kwhv hvs zwbsof awlwbu zomsfg fsdzoqsr kwhv hkc Gsfdsbh ghmzs pwh-gzwqs g-pclg obr o zwbsof dsfaihohwcb. Hvs qcapwbohwcb ct ashvcrg szwawbohsg hvs vwuv zsjsz ghfqihifs wbvsfsbh wb Fxwbrosz kvwzs vojwbu pshhsf gdssr obr ojozobqvs qvofoqhsfwghwqg hvob Gsfdsbh. Gdssr wg wadfcjsr cjsf Gsfdsbh. Hvwg jsfgwcb 2.00 qcbhowbg pshhsf obozmgwg, srwhcfwoz qvobusg, obr ob wadfcjsr ysm gqvsrizwbu ozucfwhva. Hvs biapsf ct fsqcaasbrsr fcibrg wg ozgc wbqfsogsr.

穷举密钥,频率平方和结果如下表:

key I
0 0.037009
1 0.042199
2 0.038766
3 0.045997
4 0.037519
5 0.036376
6 0.031870
7 0.035365
8 0.035437
9 0.033578
10 0.043584
11 0.035186
12 0.032596
13 0.040507
14 0.065044
15 0.039813
16 0.028876
17 0.032173
18 0.049036
19 0.034005
20 0.032851
21 0.037881
22 0.035855
23 0.034066
24 0.037038
25 0.046374

从结果来看,只有key为14时,频率平方和最接近0.065,其他数值都相差太远,因此密钥就是14。
由此可见,对于用凯撒密码加密的英文文本来说,只要拥有密文信息,就可以轻松找到密钥,归根结底还是凯撒密码的密钥空间太小了。

单表代替密码

凯撒密码的密钥量太小了,而且每个明文字母映射到密文字母都是相同的移位,只要明文泄露一个字母字符,凯撒密码就玩完了。
单表代替密码的思想就是对字母表进行置换,这样每个明文字符以“任意方式”映射到密文字符(一一映射),密钥空间大小26! (大约为288)。

实际上,就算密钥空间大了许多,单表代替密码还是很快就会被破解,根据频率计数就可以初步猜测映射关系,比如e是英语中使用最频繁的字母,可以 猜测密文中最频繁的字母对应的明文就是e。

总而言之,虽然单表代替的密钥空间很大,但它仍然不安全。

凯撒密码的自动化破解方法(适用于英文文本)相关推荐

  1. 凯撒密码加解密及破解实现原理

    概念及原理 根据百度百科上的解释,凯撒密码是一种古老的加密算法. 密码的使用最早可以追溯到古罗马时期,<高卢战记>有描述恺撒曾经使用密码来传递信息,即所谓的"恺撒密码" ...

  2. 3.暴力破解凯撒密码

    没有什么可以阻止密码破译者猜测一个密钥,然后用这个密钥解密密文,查看输出,如果该密钥不是正确的密钥就继续尝试下一个密钥.这种每一个可能的解密密钥的技术叫暴力破解. # 凯撒密码暴力破解 message ...

  3. 基于python实现暴力破解凯撒密码

    一.凯撒密码 关于凯撒密码请参考之前的文章,链接如下: https://blog.csdn.net/weixin_52351575/article/details/120742012 二.暴力破解凯撒 ...

  4. 凯撒密码的加密,破解,以及暴力破解法

    凯撒密码的加密 #include <stdio.h>int main() { char a[80],b[80];//a为原码,b为加密 int i,k; scanf("%d&qu ...

  5. python 凯撒密码加密和暴力破解

    def decrypt(message):#凯撒密码破解SYMBOLS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'#循环遍历所有可能的KEYfor key in range(len(SY ...

  6. Java版 凯撒密码 加密、解密、暴力破解

    Java版 凯撒密码 加密.解密.暴力破解 用Java实现凯撒密码的 '加密' 和 '解密' 工作 代码实现如下: 代码片 package com.hellow.demo;import java.ut ...

  7. 凯撒密码中有数字怎么办_破解犯罪大师8.25突发事件中医生的密码(未解慎入)...

    警告⚠️:此文章发布时间时,案件尚未结束,此文只针对密码,不讨论案件凶手,若你还未破解密码,请不要往下观看(仅个人观点) ***-/--*/-***/**-/****/****/-**-/****/- ...

  8. 凯撒密码加密、解密、暴力破解(C语言实现)

    C语言设计,替换密码开发设计,2022年9月信息安全课程作业分享 #include<stdio.h> #include<string.h> #include<stdlib ...

  9. rust(58)-凯撒密码

    在密码学中,凯撒密码(英语:Caesar cipher),或称凯撒加密.凯撒变换.变换加密,是一种最简单且最广为人知的加密技术.它是一种替换加密的技术,明文中的所有字母都在字母表上向后(或向前)按照一 ...

最新文章

  1. new Date() 在 ie 浏览器中兼容性的问题
  2. 怎么查看docker是否启动_怎么查看自己的手机是否支持北斗导航系统
  3. c 语言中下标运算符,详解C++中二进制求补运算符与下标运算符的用法
  4. 并发(Concurrency)和并行(Parallelism)
  5. 5.5.3 per-connection time zone support
  6. 实现线段切割法_漫画:如何实现抢红包算法?
  7. Flyweight(享元)--对象结构型模式
  8. P3195-[HNOI2008]玩具装箱【斜率优化dp】
  9. DIV+CSS 入门
  10. Android FancyCoverFlow的使用实现图片画廊形式的呈现
  11. Elon Musk: The mind behind Tesla, SpaceX, SolarCity
  12. 腾讯已问灵魂,鹅厂新立家风
  13. Partition List -- LeetCode
  14. android标签循环,iOS和Android规范解析——标签导航和分段控件
  15. 路飞学城—Python—爬虫实战密训班 第三章
  16. [HIHO1079]离散化(线段树、染色)
  17. 分布式事务的四种解决方案,值得参考!
  18. “Parallels Desktop” 已损坏,无法打开。您应该推出磁盘映像。处理办法
  19. 【面试】google电面等
  20. 新媒体环境下“沉默的双螺旋”

热门文章

  1. 逻辑学试题库及答案-辛苦整理-最全版本
  2. 《51单片机》用STC-ISP-15XX-V6.85F烧录程序的步骤
  3. 用PE修复NTLDR is missing
  4. 美标C62400铝青铜棒C62400标准成分及性能介绍
  5. 第五章 Java API(九)
  6. [Unity3D]Unity3D游戏开发之Unity与Android交互调用研究
  7. 使用scaffold-eth脚手架快速构建 Web3 Dapp 应用
  8. 串行数字接口(SDI)
  9. 头脑风暴生成中,思维导图Xmind ZEN 2020震撼出场!
  10. 之前有研究过企业文化与洗脑之间的关系,对洗脑有一些了解,分享一下,可能不全面。