学习区块链技术,不可避免地要接触到加密技术,但是作为一名非专业人士,可能很难读懂各种加密算法的基本原理和具体计算过程,但是这并不妨碍我们理解加密算法的应用场景。所以,还是有必要对加密技术有一个基本的了解。以下是我对这几天学习内容的一些总结,同时供大家参考。
加密算法分为单向加密算法和双向加密算法。
单向加密算法
单向加密算法一般指的是哈希算法,又称散列算法。包括MD5,SHA类(SHA-1,SHA-2,SHA-3)加密算法等等。
一般来说,哈希算法是不可逆的,即无法将加密后的数据还原成原始数据。任何文件都可以被哈希加密得出一段长度固定的摘要(digest),并且每一个文件对应的摘要都是独一无二的,所以摘要也被称作文件指纹。任何文件即使被修改了一个字符,它的指纹也会变得完全不同。所以文件指纹可以被用来判断文件的完整性。
应用一:判断文件完整性
比如各类下载软件都会内置文件完整性交验功能,下载文件之后内置验证器会计算文件指纹,并与服务器发过来的指纹对比,如果摘要相同,就说明文件与服务器文件相同。如果摘要不同,则说明文件不完整。
应用二:安全保存密码
哈希算法还可用于密码管理,为了用户密码的安全,服务器一般不会明文存储用户密码。服务器只存储用户密码被加密后的摘要。当用户登陆网站输入密码时,服务器会对用户输入的密码进行哈希加密,并将得出的摘要与服务器存储的摘要对比,如果相同,则说明密码正确。这样做的好处是即使服务器被黑客攻破,黑客也无法从摘要还原出用户密码。
哈希算法的安全性是由算法的难度决定的,随着计算机计算能力的增强,算法的安全性会逐渐减弱,比较早的加密算法(比如MD5)已经不是非常安全了,但是目前主流采用的SHA-2算法仍然是安全的。
双向加密算法
双向加密算法是可逆的,也就是说被加密的数据,可以通过密钥解出原始数据。双向加密包括对称加密和非对称加密。
对称加密
对称加密指的数据的加密和解密使用的是同一个密钥,特点是加解密速度快,对称加密算法包括DES(Data Encryption Standard)、AES(Advanced Encryption Standard)、IDEA(International Data Encryption Algorithm)等等。对称加密主要用于加密通讯,比如点对点聊天或者群组聊天。聊天各方都使用相同的密钥加解密消息。但是对称加密存在一个风险,就是一旦密钥泄露,群组的所有消息都会泄露。如何保证密钥在传给所有人的过程中不会泄露,是一个需要解决的问题。后来的非对称加密解决了这个问题
非对称加密
非对称加密(asymmetric cryptography)又称为公开密钥加密算法(Public-key cryptography),需要两个密钥:可以公开给任何人的公钥(public key),以及只有本人知道的私钥(private key)。公钥与私钥是一对,两者之间的关系是:
(1) 用公钥加密数据,只有对应的私钥才能解密;
(2) 用私钥加密数据,只有对应的公钥才能解密。
简单的说是“公钥加密,私钥解密;私钥加密,公钥解密”。
非对称加密的安全性要比对称加密高,因为私钥只有本人保管,不需要告诉别人,所以私钥泄露的可能性就非常低。但是对称加密中,密钥必须告诉对方,在密钥传播的过程,泄露的可能性就大大提高了。
非对称加密主要用于单向加密传输和数字签名。常见算法包括RSA,ECC(Elliptic Curve Cryptography),DSA(仅用于签名),ECDSA(仅用于签名)。
应用一:单向加密传输
单向加密传输的意思是一对密钥只能解决一个方向上的加密传输。比如A要给B发送消息,但是不想让别人看到。可以按照下面的流程操作:
(1) 接收方B首先创建一对公私密钥,然后B将其中的公钥发给A。
(2) A用B的公钥加密消息,发给B。
(3) B用自己的私钥将消息解密。
因为消息是用B的公钥加密的,所以只有B的私钥才能解密,其他人都无法解密。
单向传输过程如果B要回复A,也不想让其他人看到,可不可以用B的私钥加密消息,A用公钥解密呢?显然不行,这样操作虽然A能用公钥解密,但是因为公钥本身是公开的,其他人也能用B的公钥解密,所以B的消息所有人都能看到。
所以一对密钥只能实现单向加密传输,由接收方负责创建密钥对,并将公钥发给发送方。
由以上可知:
(1) 非对称加密能保证单向传输的安全,但是加解密速度慢,尤其在一对多传输时,密钥管理偏复杂,不适用于加密聊天。
(2) 对称加密由于加解密速度快,密钥管理简单,非常适合加密聊天,但是无法保证密钥在传输过程中的安全
结合两种加密算法的特点,当前加密通讯的解决方案是这样的:将对称加密的密钥使用非对称加密的方式进行传输。这就完美解决了对称加密的安全痛点。比如包含A,B,C的三人小组想进行加密聊天,那么聊天服务器可以创建对称加密密钥,假设密钥是"XXXX",服务器要把密钥安全地告诉A,B,C。那么操作过程如下:
(1) A,B,C各自创建密钥对,然后将各自的公钥全部发给服务器
(2) 服务器分别用A,B,C的公钥加密“XXXX”,并分别发给A,B,C。
(3) A,B,C 分别用自己的私钥解密密文,得出对称加密密钥为“XXXX”。至此,密钥已经安全地传输给A,B,C了。
(4) 所有人开始使用“XXXX”加解密消息,畅快聊天。
应用二:数字签名(digital signature)
数字签名有2个作用:
(1) 用于验证文件/消息确实是由某人/机构发布。
(2) 用于验证文件/消息没有被篡改。
非对称加密与前文说过哈希加密算法结合使用,可以产生数字签名。
比如A要发布一个软件,为了保证用户可以验证下载的软件,需要对软件进行数字签名,操作流程如下:
(1) A创建一对密钥;
(2) A用哈希算法计算出软件的指纹“XXX”;
(3) A用私钥加密这个指纹“XXX”,得出数字签名“???”;
(4) A将数字签名"???"和公钥附在软件上一起发布,示意图如下;
文件结构(5) 用户可以通过任意途径下载软件(比如各种软件站)。
(6) 用户取下软件数字签名和公钥, 用公钥解密签名,如果密文没有被篡改,结果应该是“XXX”,如果被篡改了,就是其它字符。但是下载的人并不知道正确的答案应该是什么,所以他们要进行下一步操作
(7) 用户计算软件的指纹,如果结果与上一步中解密的结果是一样的(都是“XXX”),则证明软件确实是A发布的,并且没有被篡改。如果两者结果不同,说明软件要么不是出自A,要么软件被修改过。
验证过程在这个应用场景中,发布者要用私钥加密指纹,用户用公钥解密。而在“应用一”中,私钥用来解密,公钥用于加密。这两个应用场景中,加解密的方向是相反的,那我们应该如何记忆呢?
我们用下面的思路记住:
因为只有本人才能用私钥加密,所以“私钥加密→公钥解密”的流程,可以用于签名和认证。
同理,因为只有本人才能用私钥解密,所以“公钥加密→私钥解密”的流程,可以用于解密加密消息。
至此,对称加密与非对称加密的基本概念就讲完了,上述的例子的流程只是一个大概的流程,实际过程要复杂的多,为了便于大家理解,忽略掉了很多细节。
其实前文描述的数字签名的流程是有安全漏洞的,用户是完全基于附在软件上的公钥来验证的。如果公钥同样是伪造的,那么用户验证就没有任何意义了。比如一个黑客H给软件加入后门,然后自己创建一个密钥对,用同样的流程制作附属信息:
(1) H创建一对密钥;
(2) H用哈希算法计算出后门软件的指纹“YYY”;
(3) H用私钥加密这个指纹“YYY”,得出数字签名“&&&”;
(4) H将数字签名"&&&"和公钥附在软件上一起发布
(5) 用户取下数字签名, 用黑客的公钥解密,结果是“YYY”,然后进行下一步对比
(6) 用户计算软件的指纹,结果仍然是“YYY”。验证通过,但是软件是后门软件
有漏洞的验证流程所以,为了防止上述事情发生,就必须有一种办法能够验证公钥的真实性。这就是数字证书的作用。下篇文章会详细讲解一下。
网友评论