古典密码

从远古到1949年香农发表《保密系统的通信理论》,这期间人类所使用的密码均称为古典密码,本文主要介绍三种古典密码,分别为置换密码,代换密码和轮换密码。

置换密码(又称为换位密码)

是指明文中各字符的位置次序重新排列得到密文的一种密码体制。
特点:保持明=文中所有的字符不变,只是利用置换打乱明文字符的位置和次序
置换定义:有限集X上的运算σ:X→X,σ是一个双射函数,那么称σ为一个置换。
即任意x∈X,存在唯一的x’∈X,使得σ(x)=x’
解密的时候会用到逆置换σ’,
即任意x’∈X,存在唯一的x∈X,使得σ’(x’)=x且·满足σσ’=I
例题:(仅仅是想说明一下置换的写法以及怎么样用对换的乘积进行表示在这里插入图片描述
对置换有了一个基本的认识之后我们来谈一下置换密码,置换密码有两种,一种为列置换密码,一种为周期置换密码
列置换密码
列置换密码,顾名思义,按列换位并且按列读出明文序列得到密文,具体加密步骤如下
1)将明文p以固定分组长度m按行写出nxm阶矩阵(若不m倍数,空余部分空格·补充)
2)按(1,2,3…m)的置换σ交换列的位置,σ为密钥
3)把新得到的矩阵按列的顺序依次读出得到密文c
解密过程如下
1)将密文c以固定的长度n按列写成nxm阶矩阵
2)按逆矩阵σ’交换列的位置
3)把矩阵按着行依次读出为明文
周期置换
周期变换密码是将明文P按固定长度m分组,然后对每组的字符串按置换σ重新排列位置从而得到密文
周期排列与列排列思想是一致的,只不过列排列是以矩阵的形式整列换位置,而周期是在分组以后对每组分别变换。懂得列排列就可以很容易地理解周期排列。

代换密码(又称为替代密码)

就是讲明文中的每个字符替代成密文中的另一个字符,替代后的各个字母保持原来的位置,在对密文进行逆替换就可以恢复出明文。

代换密码有分为单表代换密码和多表代换密码
单表代换密码我们分别介绍凯撒密码和仿射密码
凯撒密码
凯撒密码依据凯撒密码代换表对26个英文字母进行替换
凯撒密码代换表
在这里插入图片描述
由凯撒密码代换表可以看做英文字母表循环左移3位得到的,因此凯撒密码也称为移位密码
仿射密码(我觉得是这一章最难理解的一部分)
将26个小写字母分别对应(m=0,1,2,3,4…25)
加密变换:c=Ea,b(m)=(am+b) mod26
[理解:c=(am+b)%26]
解密变换:m=Da,b(m)=a^(-1)(c-b)mod26
其中 a,b是密钥,且满足a>=0,b>=25 gcd(a,26)=1的整数
gcd(a,26)为最大公因数,gcd(a,26)=1表示a,26为素数
a^(-1)为a的逆元
a^(-1)a=1mod26
逆元这个问题时数论中提出来的,很复杂的问题,我查阅了很多的资料大体理解他是怎么回事,可是还是有点囫囵吞枣,这里我说一下我的理解,有理解不对的地方请指正
a^(-1)a=1modm
aa^(-1)modm=1
ax+mr=1 其中r=gcd(a,m)
逆元问题等价于求解x的过程,一般有三种方法:费马小定理,扩展欧几里得算法,和线性筛,这里关于数论我就不展开了说明了,
在这里我附上了求解逆元的扩欧c++``程序

#include<cstdio>
#include<cstring> 
 int exgcd(int a,int b,int &x,int &y)    //功能为求AX+BY=C AB的最大公约数 ,这里默认为互为素数 ,一定存在为前提 
{
 if(b==0)
 {
  x=1;
  y=0;
  return a ;
 }
 int r=exgcd(b,a%b,y,x);
 y-=(a/b)*x;/
 return r ;
}
int main()
{
 int a,n,x,y;
 scanf("%d%d",&a,&n);
 exgcd(a,n,x,y);  //这里算出来的X为负,因为求逆元中间符号为负,AX+BY=C 为正,结果x为负 
 x=(x%n+n)%n  ;   //把负的转化为正的 
 //这里还可以直接写成 x=x+n; 
// x=(x+p)%p;
 printf("%d",x)  ; //return x;
}

在这里插入图片描述
运算结果如上图,求m=26,a=7的逆元,结果为15,正确
多表代换密码是指依次对明文的各组信息使用无限多的或者有限个周期重复的固定代换表进行替换来得到密文,这里介绍两种多表代换密码
维尔尼亚密码
维尔尼亚密码通过使用多个字母代换表,达到同一个字母在不同位置会被替换成不同密文的效果,方法是用一个密钥选择使用哪个字母代换表,依次使用多个字母表,当密钥的字母使用结束的时候,在从头排列
加密步骤:
1)明文数字化,把明文放第一行,数字化后值放对应明文的下面第二行
2)密钥数字化,找出密钥对应的数值(a→0,b→1,…z→25 一一对应)
周期性的放在第三行
3)按着密钥的个数分组,用明文的数值与密钥的数值分别进行模26求和结果放在第四行
4)把第四行的结果找出相对应的字母为第五行,也就是我们所求的密文。
解密过程与加密过程相似,只不过是把密文当成第一行,第四行为2.3行模26差的结果
为了方便理解,找了书上的一道例题
在这里插入图片描述
Playfair密码
Playfair密码是将明文按着两个字母一组分成若干个单元,然后将这些单元替换成了密文字母组合,替换时基于一个5X5字母矩阵,矩阵构造方法
把密钥中的字母从左到右,从上到下依次填入5X5矩阵中,如果有重复的则忽略,IJ看做一个字符,占用一个空格,同时规定表中第一列看做第五列的右边一列,第一行可以看做第五行的下一行(闭合面),其余部分按着字母顺序表依次填充(每个字母仅出现一次)
根据每对明文p1,p2,加密时根据位置分别进行如下处理

  • 若p1 p2在同一行,对应密文分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。
  • 若p1 p2在同一列,对应密文分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。
  • 若p1 p2不在同一行,不在同一列,则是由p1 p2确定的矩形的另外两个顶点字母,按同行的原则对应
  • 如p1,p2相同,则插入一个事先约好的字母,并用上述方法处理
  • 若明文的字母数为奇数,则在明文末端添加一个事先约好的字母进行填充
    解密过程和加密过程相似,只不过是把右边改成左边,下面改成上面

轮换密码

Enigame机器(我感觉就是电台。。。)
发送者用Enigame对明文加密,将生成的密文通过无线电发给接收者,接受者用自己的Enigame解密,从而得到明文。
加密过程:
1)设置Enigame,发送者按着每日密码设置Enigame
2)加密通信密码。发送者想出三个字母将其加密,这三个字母称为通信密码,需要在 Enigame上输入两次该密码,6个字母,记录其所对应的密文
3)重新设置Enigame。发送者根据通信密码重新设置Enigame
4)加密信息
5)拼接,发送者将通信密码的密文和加密后的信息进行拼接
注意:每日密码是加密通信密码的,即加密密钥的密钥。通信密码是加密信息的
解密过程:
1)分解。把密文分解成两部分,开头的6个字母和其他
2)设置Enigame,通过读每日密码设置Enigame,使接发两端Enigame状态相同
3)解密通信密码,通过前面6个密码判断通信过程中有没有失误
4)重新设置Enigame。根据通信密码重新设置Enigame
5)解密信息

在这里插入图片描述
最后分享一下我在学习的时候做的思维导图,希望对你们有所帮助。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐