过去的经验往往是走向未来的枷锁,因为在过时技术中投入的沉没成本会阻碍人们拥抱新技术。
—— chai2010
一.引子
从人类诞生出智慧,发明文字开始,人类就拥有了对信息进行加密的需求,随后的几千年里,各种信息加密方法不断产生、发展,在今天,我们把各种加密方法称之为加密算法。
英国作家阿瑟·柯南道尔在他风靡全球的侦探小说《福尔摩斯探案集》中记录了一个“跳舞的小人”的故事。
在根据原著改编的电视剧《神探夏洛克》第一季第二集中,夏洛克对凶手留下的符号(苏州码子)进行研究后得出每个小人对应着一个英文字母,进而通过频率分析的方法找出了凶手。
这种用替代或者置换移位的方法进行加密的方法被称为古典加密。
二.凯撒密码
凯撒密码是古罗马大帝凯撒在军事活动中创造的一种加密方法,用到的是古典密码中最简单的置换移位方法。其原理如下:
将字母依次向后移动三个位置,在上图中,用D代表A,E代表B......
A代表X,B代表Y,C代表Z
这个过程用代码是极其容易实现的(C语言加密):
#include<stdio.h>
#include<string.h>
int main(){
printf("请输入明文:");
char a[1000];
gets(a); //输入明文
int n;
printf("请输入移位几位数:");
scanf("%d",&n); //输入移动位数
while(n>26){
n-=26;
} //移动位数不能大于26,取余数
int len=strlen(a); //获取明文位数
for(int i=0;i<len;i++){
if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')){
if(a[i]>='a'&&a[i]<='z'){
if(a[i]+n>'z') a[i]=a[i]+(n-26);
else a[i]+=n;
}
if(a[i]>='A'&&a[i]<='Z'){
if(a[i]+n>'Z') a[i]=a[i]+(n-26);
else a[i]+=n;
}
}
}
//用if语句来对大小写进行判定
printf("密文是:");
puts(a); //输出密文
}
解密也同样简单,只需要将加密过程倒过来(C语言):
#include<stdio.h>
#include<string.h>
int main(){
printf("请输入密文:");
char a[1000];
gets(a); //输入密文
int n;
printf("请输入移位几位数:");
scanf("%d",&n); //输入移动位数
while(n>26){
n-=26;
} //移动位数不能大于26,取余数
int len=strlen(a); //获取密文位数
n=26-n; //只改了这一处,你发现了吗
for(int i=0;i<len;i++){
if((a[i]>='a'&&a[i]<='z')||(a[i]>='A'&&a[i]<='Z')){
if(a[i]>='a'&&a[i]<='z'){
if(a[i]+n>'z') a[i]=a[i]+(n-26);
else a[i]+=n;
}
if(a[i]>='A'&&a[i]<='Z'){
if(a[i]+n>'Z') a[i]=a[i]+(n-26);
else a[i]+=n;
}
}
}
//用if语句来对大小写进行判定
printf("明文是:");
puts(a); //输出明文
}
很显然,加解密可以放在一段代码里,上面的代码还是过于简陋了,对于输入数字和符号的情况也可以用if语句来进行判断,但不管怎么样,这是一种可行的方案。
对于Python来说代码短得多(加密):
def kaisa(m): #加密函数
if m==" ":
return ' '
elif 97<=ord(m)<123-key or 65<=ord(m)<91-key: #位移值不超过最后一个z字母
m=chr(ord(m)+key)
return m
elif ord(m)>=123-key or 91-key<=ord(m)<91:
m=chr(ord(m)+key-26)
return m
out=''
#求解算法
while 1:
plaintext=input('请输入明文:')
if plaintext=='退出':
break
key=eval(input('请输入位移值:'))
for i in list(map(kaisa,plaintext)):
out+=i
print('加密结果为:',out)
三.现状
凯撒密码在现在完全可以暴力破解,而在古代,人们发现英文中e和t使用的最多,可以用概率学对凯撒密码进行破解。
一直到二战,德国的恩格玛机(很多影视作品里面出现的密码机)将传统机械学,社会学,心理学与古典加密相结合,成为古典加密的巅峰。我之所以花时间写下这篇文章,不仅仅是因为我自己本身是信息安全这个专业的学生,也因为暑假时我看过的下面的ele实验室的这个视频:
现在的超级计算机破解恩格码机轻而易举。但是在那个时代,暴力破解恩格码机几乎是不可能的。最后,是天才图灵找到了破解的方法。
四.总结
尽管是记录自己学习的经历,也想把文章写得有趣一些。后面会更新对称加密(AES)和非对称加密(RSA)。在这之前,可能会先把病毒写完。我的Python不是很好,还在学习阶段,尽量都能够用Python写出来吧。新生要开学了,我也要补考,还有最近实验室也很忙。