你所需要的,不仅仅是一个好用的代理。
一提起“密码”这个词,大家总是觉得它蒙着一层神秘的面纱,给人的感觉总是神乎其神。其实不尽然,密码学源于我们的生活,反过来服务于我们,现在每个人都在使用着密码学的服务。从知乎、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。
实现代码为:
#字符表
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”
可写为
那么按行读出,密文为“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