正是一批当年看起来很没有用处的纯数学成果,使得我们现在可以在网络上可以安全地从事很多商务活动,大到签署巨额合同文件,小到双十一剁手。大家可能听说过摩尔斯电码和后来的一些其他编码方法,不过这些还都不是密码。人们编制代码的目的是为了传递人话,因此,编制代码的规则必须告诉接收方使之可以读明白。但很多时候,我们却不想让无关的人搞明白我们所传递的信息,这时就需要编制密码。
密码包括两大类,一类叫做对称性密码,另一类叫非对称性密码。所谓对称性密码,是指不论发送方编码还是接收方解码用的都是同一套密钥。在二十世纪七十年代之前,所有的密码都属于对称性密码。发送方和接收方必须提前通过安全的方式,将密码本递送给对方,才能用密钥给电信通讯的内容加密。在战争时期,递送密码本是一个艰险的工作,《红灯记》中李玉和、李奶奶为了给抗日游击队递送密码本甚至牺牲了生命。
而非对称性密码,加密与解密需要的密钥是不同的。通讯前,接收方把加密用的密钥传递给发送方,这个加密用的密钥不需要保密,因此称为公共密钥。发送方用加密的密钥把信息加密,发送给接收方。在上述通讯过程中,网络上任何人都可以偷听到加密密钥以及通讯信息,但是加密密钥对于解密通讯内容完全无用。只有接收方,使用自己保管的解密密钥,或私有密钥,才能解密通讯内容。
在实际应用中的一种常用加密方法,即RSA算法,则是一种逆运算极其困难的运算。这种算法的加密与解密方法可以用以下公式写出来:加密:c = (m^e) mod n,解密:m = (c^d) mod n。在上面公式中,m是原始信息,一串很长的数,e和n是公共密钥,相当于黑板上的两串数字。公式中 mod n 的意思是把前面那个整数除以n,留下除不尽的余数,比如16除以5,余数为1。
这样加密之后,得到一串数字c,想破解就不容易了,必须使用另一个整数d,也就是私有密钥才能得到结果。
有了这样的单向函数,我们就可以把整套密钥中的三个数大大方方地公开两个,而不用担心通讯信息被人破解。在RSA算法中,加密和解密的密钥,也就是e和d这两个数的位置是可以互换的,用公式写出来就是:( ((m^e) mod n)^d) mod n = ( ((m^d) mod n)^e)mod n = m。
这个公式表示,由于我手中持有私钥d,因此我可以用这个私钥把我的名字(加上日期时间以及序列号等信息)s编制出一段密码:(s^d) mod n = x。任何人都可以利用我以前公布的公钥,即e和n这两个数字,计算出我所编制的信息。(x^e) mod n = s。这样,就只有我可以编制出这样一个x信息,而这个x密码就成为我的电子签名。