单表代换密码

合集下载

经典密码

经典密码
①单表代换密码 ②多表代换密码
一、经典密码
⑴.单表代换密码
只使用一个密文字母表,并且用密文字母表中的一 个字母来代换明文字母表中的一个字母。 明文字母表:A ={ a0 , a1 ,..., an-1 }
密文字母表:B ={ b0 , b1 ,..., bn-1 } 定义一个由A到 B的映射:f:A→B
–因此,单表代换密码可用统计分 析攻破。
三、经典密码的统计分析
• 英语的统计规律
–每个单字母出现的频率稳定。
最高频率字母
E
次高频率字母
TAOINSHR
中高频率字母
DL
低频率字母
CUMWFGYPB
最低频率字母 V K J X Q Z
三、经典密码的统计分析
• 英语的统计规律
–频率最高的双字母组: TH HE IN ER AN RE ED ON ES ST EN AT TO NT HA ND OU EA NG AS OR TI IS ET IT AR TE SE HI OF
三、经典密码的统计分析
• 英语的统计规律
–频率最高的三字母组: THE ING AND HER ERE ENT THA WAS ETH FOR DHT HAT SHE ION HIS ERS VER
其中THE的频率是ING的3倍!
三、经典密码的统计分析
• 英语的统计规律
–英字母的约占一
半。
–还有其它统计规律!
三、经典密码的统计分析
经得起统计分析是对近代 密码的基本要求!
一、经典密码
•(2)把明文按某一顺序排成一个矩阵, 然后
按另一顺序选出矩阵中的字母以形成密文, 最后截成固定长度的字母组作为密文。
例如:

密码学原理与实践答案

密码学原理与实践答案

密码学原理与实践答案1.1 几个简单的密码体制注:小写代表明文,大写代表密文分组密码:单表代换密码:移位密码,代换密码,仿射密码多表代换密码:维吉尼亚密码,希尔密码非代换密码:置换密码流密码:同步流密码,异步流密码1.1.1 移位密码密码体制:令 P = C = K = Z 26 P=C=K=Z_{26} P=C=K=Z26 有 e K ( x ) = ( x + K ) m o d 26 d K ( y ) = ( x −K ) m o d 26 e_{K}(x)=(x+K)mod 26 \quad d_K(y)=(x-K)mod 26 eK(x)=(x+K)mod26dK(y)=(x−K)mod26 并且当K=3时叫凯撒密码。

密钥空间为261.1.2 代换密码密码体制:令 P = C = Z 26 P=C=Z_{26} P=C=Z26 对任意的置换π ∈ K \pi \in K π∈K,有 e π ( x ) = π ( x ) d π ( y ) = π − 1 ( y ) e_{\pi}(x)=\pi(x) \quadd_{\pi}(y)=\pi^{-1}(y) eπ(x)=π(x)dπ(y)=π−1(y)。

密钥空间为 26 ! 26! 26!1.1.3 仿射密码加密函数形式: e ( x ) = ( a x + b ) m o d 26e(x)=(ax+b)mod 26 e(x)=(ax+b)mod26,要求仿射函数必须是单射,也就是同余方程 a x ≡ y ( m o d 26 ) ax\equivy(mod 26) ax≡y(mod26)有唯一解。

上述同余方程有唯一解⇔ g c d ( a , 26 ) = 1\Leftrightarrow gcd(a,26)=1 ⇔gcd(a,26)=1 ,证明略。

此时a的取值为0~25之间与26互素的数,共12个,b的取值为0~25。

这时密钥空间为312。

实现单表代换加解密并对其攻击

实现单表代换加解密并对其攻击
详细的源代码见文件:attack.cpp
5.程序运行。
(1)选择密文输入方式,K为从键盘输入,F为从文件读入。如果为从文件读取,输入文件名称。程序会把密文显示在屏幕上并输出字频统计的结果。如下图所示:
(2)输入保存破译出的可能密钥和可能明文的文件名称。程序把结果破译输出到屏幕和文件。程序中只输出可能性最大的16个可能明文。
解密时,输入密钥建立代换表,然后像加密一样,把密文中的字母代换成代换表中相应的字母,从而再现明文。
3.程序设计及实现。
程序设计中对输入变量的要求:
密钥key:是26个英文字母的排列,
明文plaintext:要求明文中只能有26个字母出现,不能有其他符号包括空格,大小写不限,长度不限,可从键盘输入,也可从txt文件读入。
intDecryption(void)
Decryption()和加密一样,根据输入的密钥和密文进行解密。
具体的程序源代码见代码文件:encryption.cpp
4.程序运行。
(1)选择加密功能,输入密钥:qwertyuiopasdfghjklzxcvbnm,选择从文件输入明文,输入保存明文的文件名:plaintext.txt,输入保存密文的文件名:ciphertext.txt。运行结果如下图所示:
加密所得密文如下:
(2)选择解密功能,输入密钥:qwertyuiopasdfghjklzxcvbnm,选择从文件读入密文,输入保存密文的文件名:ciphertext.txt,输入保存解密所得明文的文件名:decryption.txt。运行结果如下:
解密所得明文如下:
二、对单表代换密码进行攻击。
1.频率统计攻击方式的理解。
密文ciphertext:全部用大写字母,只能有26个字母出现,不能有其他符号包括空格,长度不限,可从键盘输入,也可从txt文件读入。

现代密码学02 - 古典密码

现代密码学02 - 古典密码
作为参考。 2. 统计密文的字母频率 3. 比照参考文章,分析密文中的字母频率,找到字母之间的
映射关系
24
频率分析:简单代换密码的终结者 字母出现频率差别很大 频率分布极不均匀
25
频率分析:简单代换密码的终结者
字母 出现频率 字母 出现频率
a
0.082
n
0.067
b
0.015
o
0.075
c
0.028
在这种大环境下,阿拉伯世界 成为东西方文明交流的中转站,其 成就对欧洲乃至全世界都产生了巨 大影响。
Abbasid Caliphate (850)
20
频率分析:简单代换密码的终结者
频率分析 最早记录于9世纪阿尔.金迪的
革命性著作《关于破译加密信息的手稿》。 这项伟大成就是语言学、统计学和宗教信
仰之间的卓越联合,它在密码学历史上掀起 一场革命。
使用不同的代换表进行加解密。
注意:在维吉尼亚密码中,代换表不再是密钥了。
44
维吉尼亚密码
维吉尼亚密码的代换表 如右图
每行都由前一行向左移一位得到。 实际就是26个移位密码的代换表。 具体使用哪一行代换表,是基于 密钥进行的,在代换过程中会不断 变换。
45
维吉尼亚密码
明文:ATTACKATDAWN 密钥:LEMON (m=5) •加密
Julius Caesar (100 BC – 44 BC)
a b c d e . . . wx y z DE F GH . . . ZABC
没有密钥,不安全
13
移位密码
工作原理 • 加密 : 把明文中每个字母代换为字母表中其后的第k个字母
• 解密 : 与加密相反,把密文中每个字母代换为字母表中其前的第k个字母

01古典密码

01古典密码
17
移位密码实例
打开 Windows 电脑的注册表的如下目录: HKEY_CURRENT_USER\Software\Microsoft\Windows\ CurrentVersion\Explorer\UserAssist\{75048700-EF1F11D0-9888-006097DEACF9}\Count
24
单字母频率图
25
频率分组表
26个英文字母: e t---a---o---i---n---s---h---r d---l c---u---m---w---f---g---y---p---b v—k---j---x---q---z
12% 6%--9%
4% 1.5%--2.8%
<1%
26
频度最高的前30个双字母
TH HE IN ER AN RE ED ON ES ST EN AT TO NT HA ND OU EA NG AS OR TI IS ET IT AR TE SE HI OF
27
其它频率特征
① the 的使用频率最高,是ing的三倍, ② 一半的单词以e s d t 结尾 ③ 一半的单词以t a s w开头 ④ y的使用频率90%都集中在单词的结尾
a-1表示a的逆元,即a-1a≡1 (mod 26)
19
仿射密码例子
假设a=7, b=21,则a-1=15
如果明文c为security,则加密之后的密文m为rxjfkzyh 如果密文m为vlxijh,则解密之后的明文为agency
20
对仿射密码的攻击
仿射密码是比较简单的密码类型,对它的已知明文 攻击都可以很轻易地成功。
28
统计分析法
对于单表密码,虽然加密之后每个字母都变成了另外的 字母,但是这样只是把明文字母出现的概率转移到密文 字母中去

密码学3 序列密码

密码学3 序列密码

仿射加密
加密: c (am b) mod26 解密: m a1(c b) mod 26
0 m,c 25
2020/1/27
3
3. 多表代换密码
Playfair密码
将明文字母按照两个字母一组分组,然后将这 些组按照字母矩阵替换为密文字母组合。基于 一个5×5字母矩阵.
m1
,
m2
,md







kd1 kd 2 kdd
解密:
k11 k12 k1d 1
m1
,
m2
,
,
md


c1
,
c2
,
cd







kd1 kd 2 kdd
2020/1/27
5
第3章 序列密码
重点: 掌握LFSR的使用。 熟悉RC4加密算法。 学时:4-6学时
2020/1/27
24
二 特征多项式
设n级线性移位寄存器的输出序列{ai}满足递 推关系
an+k=c1an+k-1 c2an+k-2 … cnak 其中ci=0或1。 这种递推关系可用一个一元高次多项式 P(x)=1+c1x+…+cn-1xn-1+cnxn 表示,称这个多项式为LFSR的特征多项式。
2020/1/27
14
一、同步流密码
优点: 容易检测出是否有插入、删除等主动攻击。 如果密文中只有某个字符产生了错误(不是
插入或删除),只影响此字符的解密,不影 响其他字符,即无错误传播。
2020/1/27
15

单表置换密码

单表置换密码

源程序如下:import java.util.*;public class test {public static void main(String[] args) {int m;do{System.out.println("请选择操作:1、加密 2、解密 0、退出 ");Scanner input=new Scanner(System.in);m=input.nextInt();char[] ZhiHuanBiao=new char['z'+1];char[] fanZhiHuanBiao=new char['z'+1];if(m!=0)setZhiHuan(ZhiHuanBiao, fanZhiHuanBiao);switch(m) //判断m值,执行相应的功能{case 1: JiaMi(ZhiHuanBiao);break;case 2: JieMi(fanZhiHuanBiao);break;default:break;}}while(m!=0);System.out.println("程序结束!");}private static void JieMi(char[] fanZhiHuanBiao) {String jiewen;System.out.println("请输入密文");Scanner jie=new Scanner(System.in);jiewen=jie.nextLine();char[] mi=jiewen.toCharArray();System.out.println("解密后的明文为:");for(int i=0;i<mi.length;i++) //直接利用置换表输出密文{if(mi[i]>='A'&&mi[i]<='z'&&mi[i]!='\0')mi[i]=fanZhiHuanBiao[mi[i]];System.out.print(mi[i]);}System.out.println("");}private static void JiaMi(char[] zhiHuanBiao) {String mingwen;System.out.println("请输入明文");Scanner jia=new Scanner(System.in);mingwen=jia.nextLine();char[] ming=mingwen.toCharArray();System.out.println("加密后的密文为:");for(int i=0;i<ming.length;i++) //直接利用置换表输出密文{if(ming[i]>='A' && ming[i]<='z')ming[i]=zhiHuanBiao[ ming[i]];System.out.print(ming[i]);}}private static void setZhiHuan(char[] zhiHuanBiao, char[] fanZhiHuanBiao) {String s; //密钥System.out.println("请输入密钥:");Scanner zhihuan=new Scanner(System.in); //读入密钥s=zhihuan.nextLine(); //输出密钥System.out.println("置换表为:");String s1="";String s2="";for(int i = 0 ; i < s.length();i++)//对密钥去掉空格和重复的字符{boolean sign =false; //标志变量if((s.charAt(i) >= 'A' && s.charAt(i)<='Z')){for(int j = 0; j < s1.length();j++){if(s.charAt(i) == s1.charAt(j)){sign =true;break;}}if(!sign) s1=s1+s.charAt(i);else sign =true;}}for(int i = 0 ; i < s.length();i++) //对密钥去掉空格和重复的字符{boolean sign2 =false; //标志变量if((s.charAt(i) >= 'a' && s.charAt(i)<='z')){for(int j = 0; j < s2.length();j++){if(s.charAt(i) == s2.charAt(j)){sign2 =true;break;}}if(!sign2) s2=s2+s.charAt(i);else sign2 =true;}}char ch2='a';for(int i = 'A' ;i <= 'Z'; i++) //该循环利用密钥得到置换表{if(i < 'A' + s2.length()) //前面直接用s1代替{zhiHuanBiao[i] = s2.charAt(i-'A');}else//后面将剩下的"贴"上去{ for(int j = 'A'; j < 'A' + s2.length(); j++){if(ch2 == zhiHuanBiao[j]){ch2++;j= 'A'; //每次都从头开始搜索continue;}}zhiHuanBiao[i] = ch2;ch2++;}System.out.print(zhiHuanBiao[i]+" ");//同时输出置换表}char ch='A';System.out.println();for(int i = 'a' ;i <= 'z'; i++) //该循环利用密钥得到置换表{if(i < 'a' + s1.length()) //前面直接用s1代替{zhiHuanBiao[i] = s1.charAt(i-'a');}else//后面将剩下的"贴"上去{for(int j = 'a'; j < 'a' + s1.length(); j++){if(ch == zhiHuanBiao[j]){ch++;j= 'a'; //每次都从头开始搜索continue;}}zhiHuanBiao[i] = ch;ch++;}System.out.print(zhiHuanBiao[i]+" ");//同时输出置换表}System.out.println();for( int i='A'; i<= 'z'; i++) //该循环利用置换表得到反置换表{ if(zhiHuanBiao[i]!='\0')fanZhiHuanBiao[ zhiHuanBiao[i]] = (char) i;}for( int i='A'; i<= 'Z'; i++){ if(fanZhiHuanBiao[i]!='\0')System.out.print(fanZhiHuanBiao[i]+" ");}System.out.println();for( int i='a'; i<= 'z'; i++){ if(fanZhiHuanBiao[i]!='\0')System.out.print(fanZhiHuanBiao[i]+" ");}System.out.println();}}实验结果:。

密码学实验-实验1 凯撒密码与单表置换

密码学实验-实验1 凯撒密码与单表置换
foriinAlphaBet:
ifkey.count(i) ==0:
AlphaBet1[k] = i
k +=1
#将key中重复的字母删除
chuli_key()
#将key加入到密码表中
add_key()
#判断字母大小写
foriinmiwen:
ifi.isspace() ==True:
mingwen = mingwen +' '
"J","K","L","M","N","O","P","Q","R",
"S","T","U","V","W","X","Y","Z"]
#小写字母表
alphaBet = ["a","b","c","d","e","f","g","h","i",
"j","k","l","m","n","o","p","q","r",
char f(int i)
{
for(int x=0;x<26;x++)
if(str_passtable[x]==(i+'a'))return (x+'a');
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告
姓名:1111 学号:111111 班级:1111111 日期:111
1 古典密码(单表代换密码)
一、实验环境
1.硬件配置:处理器:Corei5 M ***********,内存2GB,主硬盘
320G
2.使用软件:
(1)操作系统:win7
(2)软件工具:Microsoft Visual C++6.0
二、实验设计的相关概念或基本原理
1.单表代换密码的基本原理:
对字母表中的每一个字母用别的字母代换形成密文。

明文和密文代换的规则可以是先任选一个易记的单词或短语或一句话作为密钥放在前面,然后从A到X的顺序中剔除前面出现过的字母后依次补在后面,形成代换表。

三、实验内容
根据实验原理的介绍,你先选取一个密钥,创建一个明文信息,编写实现程序,实现加密和解密的操作。

实验流程图:
四、实验总结分析
关键代码:
1.产生代换表:
void generate_alphabeta( )//产生代换表
{
int i,j;
cout<<"请先输入密钥句子,至少为1个字符,最多100个字符,且第一个字符必须是小写字母:"<<endl;
cin>>miyue;//输入的密钥句子,至少为1个字符,最多100个字符,且第一个必须为字母
cout<<miyue<<endl;
int length=strlen(miyue);
//cout<<"密钥句子的长度为:"<<length<<endl;
int pos=0;//指示填充位置
int tag=1;//
alphabeta[0] =miyue[0];//填充第0个位置
for(i=1;i<length;i++)
{
if (isalpha(miyue[i])!=0) //是字母
{
tag=1;
for (j=0;j<=pos;j++)
{
if(alphabeta[j]==miyue[i])//alphabet表中已经存在字母miyue[i]
{
tag=0;
break;
}
}
if(tag==1)
alphabeta[++pos]=miyue[i];
}
}
for(i=0;i<26;i++) //把英文字母表中还没有出现在代换字母表中的字母存入代换字母表
{
tag=1;
for (j=0;j<=pos;j++)
{
if(alphabeta[j]==str[i])//alphabet表中已经存在英文字母表中的第i个字母{
tag=0;
break;
}
}
if(tag==1)
alphabeta[++pos]=str[i];
}
cout<<"原始字母表为"<<str<<endl;
cout<<"代换密码表为"<<alphabeta<<endl;
}
2.加密算法
int encrepty( )//加密
{
int pos;
//alphabeta[0]是序号为0的字母a的密文,alphabeta[1]是序号为1的字母的密文...,依次类推
for(int i=strlen(source);i>=0;i--)
{
if(islower(source[i]))//假如当前字符是小写字母
{
pos=source[i]-'a';//计算出当前字母在字母表中的序号
cipher[i]=alphabeta[pos];
}
else //不是字母,原样复制
cipher[i]=source[i];
}
cout<<"密文为:"<<cipher<<endl;
return 1;
}
3.解密算法
int deciphring( )//解密
{
for(int i=strlen(cipher);i>=0;i--)
{
if(islower(cipher[i]))//假如当前字符是小写字母
{
for (int j=0;j<26;j++)
{
if(cipher[i]==alphabeta[j])
//当前密文字符,在代换字符表的第j个位置,在其明文字符为str[j];
{
source[i] =str[j];
break;
}
}
}
else //不是字母,原样复制
source[i]=cipher[i];
}
cout<<source<<endl;
return 1;
}
结果显示:
4.小结
此算法的难点在于如何通过密钥句子写出代换表,根据算法的思路,主要是要解决去掉密钥句子中重复字母,再将未出现过的字母依次填充代换表中,形成最终的代换表。

在编程的过程中,看似简单的过程却总是无法正常实现填充过程,后来在与同学讨论之后,发现使用布尔变量来作为是否已存在相同字母的填充标记,最终解决了如何填充的问题。

相关文档
最新文档