阿布云

你所需要的,不仅仅是一个好用的代理。

Python之古典密码

阿布云 发表于

22.png

一提起“密码”这个词,大家总是觉得它蒙着一层神秘的面纱,给人的感觉总是神乎其神。其实不尽然,密码学源于我们的生活,反过来服务于我们,现在每个人都在使用着密码学的服务。从知乎、QQ等的验证登录,到支付宝的安全支付,再到最近火热的比特币和区块链技术,都离不开密码的支持。笔者想通过一系列的Python密码学教程,使大家正确认识密码学,理解密码基本概念,并能正确将密码学应用于实践之中。

本节将介绍密码学的基本概念和发展历程,以古典密码为例,了解密码学的基本加密方法。

一、密码学简介

密码学是一门非常古老的学科,是把人们能够读懂的消息变换成不易读懂的信息用来隐藏信息内容,使得窃听者无法理解消息的内容,同时又能够让合法用户把变换的结果还原成能够读懂的消息。

密码学的发展经历了3个阶段:(1)古典密码。这个时期的密码应该被称之为艺术,而不是科学,是古代人民智慧的结晶,典型的密码有阴符、藏头诗、石蜡密信、反切密码(明代戚继光)、凯撒密码和天书等。(2)近代密码。1949年,伟大科学家香农发表了著名的《保密系统的通信理论》和《通信的数学理论》两篇文章,使得密码学从此由艺术走上了科学的道路,成为一门学科。(3)现代密码学。1976年,美国国家标准局公布了数据加密标准(DES),这一对称密码标准在世界上广泛流传和应用;同年,密码学家、图灵奖获得者Diffie和Hellman(2016年图灵奖)发表了《密码学的新方向》,开创了公钥密码学的新纪元。

二、古典密码

作为密码学的最开始发展阶段,虽然并未形成体系,但有了近现代密码的雏形,体现了密码学的加密思想。

两种基本的加密思想为:(1)代替(substitution)/替换,即明文字符被其他字符所替换,典型的密码为凯撒密码。(2)置乱(permutation)/置换,即打乱明文字符的顺序,典型的密码有天书、栅栏密码、矩阵密码等。

下面介绍最为经典的两种古典密码,即凯撒密码和栅栏密码,并使用Python进行实现。

2.1 凯撒密码

该密码以被古罗马皇帝凯撒使用而闻名,用于和将军们进行联系。它通常被作为其他更复杂的加密方法中的一个步骤,例如维吉尼亚密码。但是和所有的利用字母表进行替换的加密技术一样,恺撒密码非常容易被破解,而且在实际应用中也无法保证通信安全。

其基本思想是:通过把字母移动一定的位数来实现加密和解密。例如,密匙是把明文字母的位数向后移动三位,那么明文字母B就变成了密文的E,依次类推,X将变成A,Y变成B,Z变成C。

1.png

实现代码为:

#字符表

mstr='abcdefghijklmnopqrstuvwxyz'

#字符表长度

lengthM=len(mstr)

 

#strs为输入的明文,shitf为移动的位数

def caesar(strs,shift):

    newstrs =''

    for x in strs:

            #获取x字符在mstr中的位置

        numX=mstr.index(x)

        

            #新的字符位置加上shift

        numX=(numX+shift)%lengthM

        

        newstrs=newstrs+mstr[numX]

     

    return newstrs

 

if __name__ == '__main__':

    strs = raw_input("Enter character sequence:")

    shift = input("Shift Numbers:")

    C=caesar(strs,shift)

    print("CiperText:",C)

    print("PlainText:",caesar(C,int(shift)*(-1)))

运行结果为:

 

>>Enter character sequence:abcde

>>Shift Numbers:3

('CiperText:', 'defgh')

('PlainText:', 'abcde')

2.2 栅栏密码

该密码的思想是“按列写入,按行读出”,就是把要加密的明文分成N个一组,然后把每组的第1个字连起来,形成一段无规律的话。

例如:用深度为2的栅栏技术加密明文“meet me after the party”

可写为

2.png

那么按行读出,密文为“mematrhtpryetefeteat”

 

def encrypt(pT,key):

    #一维key列的字符串数组

    array=[""]*key

    

   #将明文pT,按列写入array中

    for x in range(0,len(pT)):

        row=x%key

        array[row]+=pT[x]

        print array

    

    #cp即为密文,将array按行读出    

    cp=""    

    for x in array:

        cp+=x

   

    return cp

 

 

if __name__ == '__main__':

    #明文    

    plainTxt="meetmeaftertheparty"

    #栅栏设置为2栏

    key=2

    #对明文加密,并输入密文

    cipherTxt=encrypt(plainTxt,key)

    print cipherTxt