单表代换密码
- 格式:doc
- 大小:87.00 KB
- 文档页数:5
//单置换密码的编程实现(C++)//作者信息:////本程序使用方法:需要在本程序所在的文件夹创建一个"密码学.txt"文档,//该程序所需要的数据全部由该文档提供,然后运行即可得到结果,如需要修改数据,必须从文档中人工修改//文档格式的要求:文档总共包含两行。
第一行由一个1或2的数字和一个字符串组成,数字1代表加密,2代表解密,字符串表示密钥//第二行仅包含一个字符串,这个字符串是需要加密或解密的内容。
//该程序运行结果直接由控制台输出运行结果:#include<iostream>#include<string>#include<fstream>using namespace std;ifstream in("密码学.txt");void JiaMi(char ZhiHuan[]); //加密函数void JieMi(char ZhiHuan[]); //解密函数void setZhiHuan(char ZhiHuan[],char fanZhiHuanBiao[]); //设置置换表函数int main(){int m; //确定是加密或解密?加密为1,解密为2char ZhiHuanBiao['z'+1]; //正向置换表,加密时用char fanZhiHuanBiao['Z'+1]; //反向置换表,解密时用cout<<"加密按输入1,解密输入2"<<endl;in>>m; //读入msetZhiHuan(ZhiHuanBiao, fanZhiHuanBiao); //设置置换表switch(m) //判断m值,执行相应的功能{case 1: JiaMi(ZhiHuanBiao);break;case 2: JieMi(fanZhiHuanBiao);break;default:break;}return 0;}void JiaMi(char ZhiHuan[]) //加密{string MingWen; //保存明文cout<<endl<<"请输入明文:";getline(in,MingWen); //读入明文cout<<MingWen<<endl;cout<<"加密后的密文为:"<<endl;for(int i=0; i<MingWen.length(); i++) //直接利用置换表输出密文{if(MingWen[i]>='a' && MingWen[i]<='z')cout<<ZhiHuan[ MingWen[i] ];else cout<<MingWen[i];}cout<<endl;}void JieMi(char fanZhiHuan[]){string MiWen; //保存密文cout<<endl<<"请输入密文:";getline(in,MiWen); //读入密文cout<<MiWen<<endl;cout<<"解密后的明文为:"<<endl;for(int i=0; i<MiWen.length(); i++) //直接利用反置换表输出明文{if(MiWen[i]>='A' && MiWen[i]<='Z')cout<<fanZhiHuan[ MiWen[i] ];else cout<<MiWen[i];}cout<<endl;}void setZhiHuan(char ZhiHuanBiao[],char fanZhiHuanBiao[]){int i; //i和j是循环变量,除此之外没有任何意义char j;string s; //密钥cout<<"请输入密钥(大写):";getline(in,s); //读入密钥cout<<s<<endl; //输出密钥cout<<"置换表为:"<<endl;string s1;for(i = 0 ; i < s.length();i++) //对密钥进行处理(去掉空格和重复的字符){bool sign =0; //标志变量if(s[i] >= 'A' && s[i] <='Z'){for(int j = 0; j < s1.length();j++){if(s[i] == s1[j]){sign = 1;break;}}if(sign == 0) s1 = s1 + s[i];else sign = 0;}}for( j ='a';j<='z';j++)cout<<j<<" ";cout<<endl; //输出小写字母从a到zchar ch='A';for( i = 'a' ;i <= 'z'; i++) //该循环利用密钥得到置换表{if(i < 'a' + s1.length()) //前面直接用s1代替{ZhiHuanBiao[i] = s1[i-'a'];}else //后面将剩下的"贴"上去{for(int j = 'a'; j < 'a' + s1.length(); j++){if(ch == ZhiHuanBiao[j]){ch++;j= 'a'; //每次都从头开始搜索continue;}}ZhiHuanBiao[i] = ch;ch++;}cout<<ZhiHuanBiao[i]<<" "; //同时输出置换表}cout<<endl;for( i='a'; i<= 'z'; i++) //该循环利用置换表得到反置换表{fanZhiHuanBiao[ ZhiHuanBiao[i] ] = i;}for( i='A'; i<= 'Z'; i++) //输出反置换表{cout<< fanZhiHuanBiao[i] <<" ";}cout<<endl;}。
单表代替密码原理及算法实现 要了解单表替代密码就得先了解替代密码,在这⾥我就做⼀下简单的介绍:替代是古典密码中⽤到的最基本的处理技巧之⼀。
替代密码是指先建⽴⼀个替换表,加密时将需要加密的明⽂依次通过查表,替换为相应的字符,明⽂字符被逐个替换后,⽣成⽆任何意义的字符串,即密⽂,替代密码的密钥就是其替换表。
根据密码算法加解密时使⽤替换表多少的不同,替代密码⼜可分为单表替代密码和多表替代密码。
单表替代密码的密码算法加解密时使⽤⼀个固定的替换表。
单表替代密码⼜可分为⼀般单表替代密码、移位密码、、密钥短语密码。
这⾥讲单表替代密码的直接攻击。
对于⾃然语⾔,如果取⼀本⾮专业书籍,统计⾜够长的课⽂就会发现,字母(或字符)出现的频率会反映出相应语⾔的统计特性。
统计⼤量的课⽂定会发现,相应语⾔中每个字母在相应语⾔中出现的概率。
于是便得到该语⾔字母表上的⼀个概率分布。
⼀、英⽂字母⼀由独⽴试验产⽣明⽂单码,Beker在1982年统计的样本总数为100 362,得到单码的概率分布见下表:根据上表,英⽂字母出现的概率按⼤⼩排列如下:E T A O I N S H R D L C U M WFG Y P B V K J X Q Z在上表中,不少字母出现的概率近乎相等。
为了应⽤⽅便,常将英⽂字母表按字母出现的概率⼤⼩分类,分类情况见下表:--------------------------极⾼频 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--------------------------其它语⾔和数据也有类似于英语语⾔的单字母统计特性。
如果我们随意统计⼀段⾜够长的英⽂课⽂,只要内容不是太特殊,其结果⼀定和上表基本相同。
这表明英⽂的⼀篇⽂章中各个字母出现的概率是基本可预测的,它将为密码分析提供⼀个⽅⾯的依据。
语⾔的单字母统计特性⾄少在以下两个⽅⾯没有反映出英⽂语⾔的特征:⑴根据英⽂的单字母统计特性可以计算出双字母QE出现的概率为p(QE)=0.00095×0.12702≈1.21×10^(-4)这就是说,在10^6个双字母的抽样中,QE出现的次数⼤约应为121次,但这不符合英⽂课⽂的实际。
单表代换密码课程设计一、课程目标知识目标:1. 学生能理解单表代换密码的定义和基本原理;2. 学生能够掌握至少一种单表代换密码的加密和解密方法;3. 学生能够解释单表代换密码在历史和现代通信中的应用和重要性。
技能目标:1. 学生能够运用所学知识,独立完成单表代换密码的加密和解密操作;2. 学生能够运用逻辑思维和分析能力,破解简单的单表代换密码;3. 学生能够运用单表代换密码进行简单信息的传递和解读。
情感态度价值观目标:1. 学生能够认识到密码学在信息安全中的重要作用,增强信息安全意识;2. 学生通过学习单表代换密码,培养对密码学的好奇心和探索精神;3. 学生能够体会到团队合作在解决问题中的优势,增强团队协作意识。
课程性质:本课程为信息技术与信息安全领域的拓展课程,旨在通过学习单表代换密码,提高学生的信息素养和逻辑思维能力。
学生特点:考虑到学生所在年级的特点,课程内容设计将结合学生的认知水平和兴趣,以实际操作和案例分析为主线,增强学生的学习兴趣和参与度。
教学要求:教师应注重理论与实践相结合,通过问题驱动的教学方式,引导学生主动探究和解决问题,确保学生达到课程目标所设定的具体学习成果。
同时,关注学生的个体差异,给予个性化指导,使全体学生都能在课程中取得进步。
二、教学内容1. 单表代换密码的定义与分类:介绍单表代换密码的基本概念、分类及其特点,结合教材相关章节,使学生理解其在密码学中的地位和作用。
2. 单表代换密码的加密方法:详细讲解至少一种单表代换密码的加密过程,如凯撒密码、替换密码等,让学生掌握其基本操作和原理。
3. 单表代换密码的解密方法:分析单表代换密码的解密技巧,指导学生学会如何逆向思考,破解加密信息。
4. 单表代换密码的应用实例:通过案例分析,介绍单表代换密码在历史和现代通信中的应用,让学生了解其实际价值。
5. 单表代换密码的安全性分析:探讨单表代换密码的安全性,分析其可能存在的弱点,引导学生思考如何提高密码的安全性。
实验一古典密码—单表代换【实验目的】理解代换密码的基本思想理解移位密码、仿射密码等算法的原理掌握上述各个算法的输入输出格式和密钥格式掌握上述各个算法的加解密过程和实现方法【实验原理】代换密码体制的一般定义为M=C=K=Z26,其中M为明文空间、C为密文空间、K为密钥空间、Z26为26个整数(对应26个英文字母)组成的空间;要求26个字母与模26的剩余类集合{0,1,2,…,25}建立一一对应的关系。
一、移位密码移位密码的加密实现上就是将26个英文字母向后循环移动k位,其加解密可分别表示为:c=E k(m)=m+k(mod 26)m=D k(c)=c-k(mod 26)其中,m、c、k是满足0≤m,c,k≤25的整数。
二、乘法密码乘法密码是通过对字母等间隔抽取以获得密文,其加解密可分别表示如下:-1c=mk(mod 26)m=ck(mod26)其中,m、c、k是满足0≤m,c,k≤25,且gcd(k,26)=1的整数。
三、仿射密码仿射密码的加密是一个线性变换,将移位密码和乘法密码相结合,其加解密可分别表示为:C=E a,b(m)=am+b(mod 26)M=D a,b(C)=a-1(c-b)(mod 26)其中:a、b是密钥,是满足0≤a,b≤25和gcd(a,26)=1的整数,即a和26互素;a-1的逆元,即a•a-1≡1 mod 2【实验环境】ISES客户端Microsoft CLR Debugger 2005或其它调试器【实验内容】通过运算器工具实现移位密码、乘法密码、仿射密码对各个算法的加解密进行扩展实验和算法跟踪【实验步骤】此处以移位密码为例说明,乘法密码、仿射密码可参照完成。
一、加解密计算(一) 加密(1) 参照实验原理,在明文栏输入所要加密的明文,在密钥栏输入相应的密钥,如下图1.1-2所示。
图 1.1-2(2) 点击“加密”按钮,在密文文本框内就会出现加密后的密文,如图1.1-3所示。
实验二密码置换一.单表置换密码(1)单击“密码工具”按钮,进入“加密解密”|“单表置换”|“加密/解密”视图,与同组主机协商好一个密钥词组k=key 。
(2)根据“单表置换”实验原理计算出置换表。
(3)计算完成置换表以后,在明文输入区输入明文,单击“加密”按钮用置换表的对应关系对明文进行加密,加密完成后,单击“导出”按钮,将密文导出到SingleTable共享目录中,并通告同组主机获取密文。
请将明文记录在这里:hello 。
(4)单击“导入”按钮将同组主机单表置换密文导入,根据同组主机置换表完成本机置换表,单击“解密”按钮对密文进行解密。
SJKVT(5)本机将解密后的明文与同组主机记录的明文对照,如果双方的明文一致,则说明实验成功,否则说明本机或同组主机的置换表计算错误。
1)图1是由统计学得出的英文字母相对频率表。
由图1可以看出,英文字母E出现的频率最高,而J和Z出现的频率最低,这样,就可以通过英文字母出现的频率大致上判定单表置换密码的置换表,从而得到明文。
(2)本机进入“密码工具”|“加密解密”|“单表置换”|“密码分析”页面,单击“导入”按钮,将密文“单表置换密码分析密文.txt”导入,单击“统计”按钮,统计密文中每个字母出现的频率,回答下列问题:在密文中出现频率最高的字母是A 。
与上表比较,它可能是由字母 E 置换的。
(3)置换表组框中点击“解密”按钮,这时将得到一个明文。
然而此时的明文并不是最终要得到的,可以通过明文的特征和各个字母的比例来调节置换表中的对应关系,从而得到正确的明文。
三.源码应用(选做)设计单表置换加密工具,利用单表置换加密算法对文件进行加密。
单击工具栏“单表置换加密工具工程”按钮。
基于此工程进行程序设计。
实验五惟吉尼亚算法(1)本机单击“密码工具”按钮,进入“加密解密”|“维吉尼亚密码”|“加密/解密”视图,与同组主机协商好密钥=key (此密钥分成标准和扩展型,在实验中自行选择)。
密码学原理与实践答案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。
代换密码(代替密码)就是明文中每一个字符被替换成密文中的另外一个字符,代替后的各字母保持原来位置。
对密文进行逆替换就可恢复出明文。
有四种类型的代替密码:(1)单表代替密码:就是明文的一个字符用相应的一个密文字符代替。
加密过程中是从明文字母表到密文字母表的一一映射。
(2)同音代替密码:它与简单代替密码系统相似,唯一的不同是单个字符明文可以映射成密文的几个字符之一,例如A可能对应于5、13、25或56,“B”可能对应于7、19、31或42,所以,同音代替的密文并不唯一。
(3)多字母组代替密码:字符块被成组加密,例如“ABA”可能对应于“RTQ”,ABB可能对应于“SLL”等。
(4)多表代替密码:由多个简单的代替密码构成,例如,可能有5个被使用的不同的简单代替密码,单独的一个字符用来改变明文的每个字符的位置。
多字母代替密码是字母成组加密,在第一次世界大战中英国人就采用这种密码。
字母成对加密。
把Huffman编码用作密码,这是一种不安全的多字母代替密码。
多表代替密码。
维吉尼亚密码是多表代替密码的例子。
多表代替密码有多个单字母密钥,每一个密钥被用来加密一个明文字母。
第一个密钥加密明文的第一个字母,第二个密钥加密明文的第二个字母等等。
在所有的密钥用完后,密钥又再循环使用,若有20个单个字母密钥,那么每隔20个字母的明文都被同一密钥加密,这叫做密码的周期。
在经典密码学中,密码周期越长越难破译,使用计算机就能够轻易破译具有很长周期的代替密码。
凯撒密码就是单表代替密码,它的每一个明文字符都由其右边第3个(模26)字符代替(A由D代替,B由E代替,W由Z代替,X由A代替,Y由B代替,Z由C代替)。
单表代替密码是很容易破译的,因为它没有把明文的不同字母的出现频率掩盖起来。
可以使用统计攻击。
令26个字母分别对应于整数0~25,a=1,b=2……y=25,z=0。
凯撒加密变换实际上是c≡ (m + k) mod 26其中m是明文对应的数据,c是与明文对应的密文数据,k是加密用的参数,叫密钥。
实验报告
姓名: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.小结
此算法的难点在于如何通过密钥句子写出代换表,根据算法的思路,主要是要解决去掉密钥句子中重复字母,再将未出现过的字母依次填充代换表中,形成最终的代换表。
在编程的过程中,看似简单的过程却总是无法正常实现填充过程,后来在与同学讨论之后,发现使用布尔变量来作为是否已存在相同字母的填充标记,最终解决了如何填充的问题。