过去的经验往往是走向未来的枷锁,因为在过时技术中投入的沉没成本会阻碍人们拥抱新技术。

                                                                                         

   —— 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实验室的这个视频:

https://www.bilibili.com/video/BV1DS4y1R7hM/spm_id_from=333.788.recommend_more_video.-1&vd_source=c09e4bdc6c606829f624e66481a1f73d

现在的超级计算机破解恩格码机轻而易举。但是在那个时代,暴力破解恩格码机几乎是不可能的。最后,是天才图灵找到了破解的方法。

四.总结

尽管是记录自己学习的经历,也想把文章写得有趣一些。后面会更新对称加密(AES)和非对称加密(RSA)。在这之前,可能会先把病毒写完。我的Python不是很好,还在学习阶段,尽量都能够用Python写出来吧。新生要开学了,我也要补考,还有最近实验室也很忙。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐