引文
密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。
在《一万字带您走进密码学的世界(上)》的文章中我们探讨了对称密码体系,哈希函数等技术,本文继续探讨密码学剩余的部分,本文的主要内容包括,非对称密码体系,签名算法等,因为本部分是区块链技术的基石,所以我会讲的更加详细一点,虽然我已经尽最大努力使思想简化,但是其中的数学理论对于很多人还是很晦涩,建议读者开始之前先读下数论的有关知识。本部分的主要结构如下:
非对称密码
前面的文章我们探讨了对称加密,在对称秘钥加密的体系中,加密和解密使用同一个秘钥,显而易见的是这种方式存在一个很严重的弊端,那就是秘钥的分发和管理,一旦秘钥在分发过程中被人窃取,加密形同虚设。秘钥的管理也相当繁琐,如下图,如果我们要同时与n个人通信,那么每个人都将保存n-1个秘钥。
非对称的存在的意义就是为了克服这些问题,在非对称秘钥体系中,通信双方各有一个公钥和私钥,加密者使用私钥进行加密,然后传递解密者,解密者使用对方的公钥直接就可以解开,不存在秘钥秘钥传递的问题,为了更好的解释这个问题,下面用个简单的例子讲解一下。
一个简单的例子
Alice和Bob用传统信件进行沟通,假设Alice和Bob不相信有邮政系统,他们想在通信的时候把信件用箱子锁住,并且在箱子外面加上一个锁。
在公钥加密体系中,Alice首先将消息放在盒子中,然后锁上盒子用她的钥匙,然后将盒子发给bob,Bob收到盒子后然后用钥匙打开,很显然,这个钥匙一定是alice钥匙的副本,不然打不开
在上面的例子中我们知道,秘钥交换是一定存在的,在沟通之前一定要进行秘钥的交换,那么有没有其他的方案可以不进行秘钥交换呢,答案是有的,Alice首先将消息放在盒子中,然后锁上盒子用她的钥匙,然后将盒子发给bob,Bob收到盒子后然后用锁锁上,然后在返回给Alice,这个时候盒子上是有两把锁的,然后Alice去掉自己的锁,这样盒子上就剩下Bob的一把锁了,然后在将盒子发给Bob,Bob用自己的钥匙打开自己的锁,就看到其中的消息。
上面的方法是可以实现不用秘钥交换,但是确定就是过于复杂,那么有没有更好的方式呢?在对称密码体系中,问题将变得简单,Bob直接将自己的打开的锁发给Alice,Alice收到锁后,然后用这个锁加密锁住装有消息的盒子,然后发给Bob,Bob可以很轻易的打开自己的锁。
在这个方法中一个重要的环节就是在已知Bob的锁和箱子的时候时候,没有BOb的钥匙是一定是打不开,在显示生活中很容易理解,可以在计算机的世界中如何寻找到这样合适的算法,目前已知的算法有两种,一种是基于离散对数的问题,另一种是椭圆曲线连对数问题,在下面的算法中我们着重讲解离散对数的问题。
Diffie-Hellman密钥交换
Diffie-Hellman密钥交换首次出现在Diffie和Hellman的论文中,这篇影响深远的论文奠定了公开密钥密码编码学,因此该算法通常称之为Diffie-Hellman密钥交换。这种密钥交换技术的目的在于使得两个用户安全地交换一个秘密密钥以便用于以后的报文加密。
Diffie-Hellman加密算法的有效性依赖于计算离散对数的难度。简言之,可以如下定义离散对数:
首先定义一个素数p的原根,为其各次幂产生从1 到p-1的所有整数根,也就是说,如果a是素数p的一个原根,那么数值 amodpamodp,a1modpa1modp,…,ap-1 mod p 是各不相同的整数,并且以某种排列方式组成了从1到p-1的所有整数。对于一个整数b和素数p的一个原根a,可以找到惟一的指数i,使得 b = ai mod p 其中0 ≤ i ≤ (p-1)指数i称为b的以a为基数的模p的离散对数或者指数,该值被记为inda,p(b)。
上面的一段引用看的一脸懵逼对吧,其实我也有又这样的感觉,我始终觉得一个优秀的学术工作者,要写出能读懂的文章,而不是别人看不懂的东西去彰显自己的高大上。好了就不吐槽了,我们开始用简单的例子解释上面的意思
首先说取摩运算,就是我们经常说的取余,比如我们对3对12进行取余就是3,9对12取余就是9,27对12取余就是3 简单点说:
3xmod12=y3xmod12=y 其中 x∈(1,2,3…n)x∈(1,2,3…n) 在这里如果我们已知x,可以很轻易的计算出y的值,及时x的值比较大,利用计算机也可以很轻易的算出,但是如果已经y,即使用高性能的计算机也很难计算出x,这就是离散对数的问题。
离散对数公钥加密算法是目前最为热门的公钥加密算法 ,其安全性要远远高于基于大数分解的RSA算法,首先说明一下上述三位科学家公钥密码体制的运作过程(假定A和B两个人要在一个不安全通道如因特网上形成密钥以备日后加密解密所用)。
首先,A、B两人要共同公开约定一个素数q和有限域Fq中的一个生成元g;
A选定一个随机数a∈{1,2,…,q-1}(a可以认为是A之私钥),并将ga(modq)ga(modq)传送给B;
B选定一个随机数b∈{1,2,…,q-1}(b可以认为是B之私钥),并将gb(modq)gb(modq)传送给A;
此时A可以算出(gb)a(modq)(gb)a(modq),B也可以算出(ga)b(modq)(ga)b(modq),由于
(gb)a(modq)=(ga)b(modq)=gab(modq)(gb)a(modq)=(ga)b(modq)=gab(modq),
因此,A和B就形成了一个公共的密钥gab(mo