非对称加密
[TOC]
公私钥介绍
简介
考虑到安全性,通常数据的发送方都会对原始数据进行加密,接收方对收到的数据进行解密还原出原始数据,其中的加密、解密过程就离不开密钥这个工具。密钥又分为公钥与私钥,它们是一组密钥对,在非对称加密算法(下文会提到)中,两者必须配合使用。顾名思义,公钥是公开的,大家都可以知道。私钥是私密的,只掌握在自己手中。讲到公钥、私钥就不得不提一下两种加密算法。
加密算法
对称密钥加密
也叫做对称加密、共享密钥加密,是指加密和解密时使用相同的密钥,这个密钥会通过收发双方进行协商来确定,只有发送方和接收方知晓,所以对称密钥加密也被称作私钥加密,如果协商过程中被截获,也就意味着信息泄露,
- 优点:计算速度快
- 缺点:一旦密钥被截获,则信息就会泄露
非对称加密
这种加密算法就要用到开篇讲到的密钥对。之所以叫非对称,是因为加密和解密的过程使用的是不同的密钥,一个是公钥,一个是私钥。一般我们用公钥加密,用私钥解密,例如,接收方B会将公钥发给发送方A,A使用B发来的公钥对数据加密并发送给B,B在收到后使用对应的私钥将数据解密获取到原始数据。注意这里的公与私并不是绝对的,而是相对的,用公钥加密,则只有对应的私钥可以解密,若用私钥加密,则对应的公钥也可以用来解密。反过来说,如果用公钥可以解密,那么必然是对应的私钥进行的加密。
- 优点:加、解密使用的密钥不同,更加安全
- 缺点:计算速度慢
两种加密算法结合使用
数据传输时,将对称算法和非对称算法结合使用,既能保证安全,也能保证计算速度。其本质为:收发双方在协商对称密钥的过程中使用非对称算法将对称算法的对称密钥进行加密,后续的数据传输都使用这个对称密钥来加、解密。(有点绕),下面是整个过程的步骤分解
- 接收方生成一个公钥和一个私钥
- 接收方将公钥发送给发送方
- 发送方使用公钥将对称密钥加密,并发送给接收方
- 接收方使用私钥解密得到对称密钥
- 发送方使用对称密钥对原始数据加密,发送给接收方
- 接收方使用对称密钥解密得到原始数据
公私钥两种用法
首先,每个用户都有两把钥匙,一把公钥一把私钥。公钥是对外发布的,所有人都看的到所有人的公钥,私钥是自己保存,每个人都只知道自己的私钥而不知道别人的。
公钥加密私钥解密
用该用户的公钥加密后只能该用户的私钥才能解密。这种情况下,公钥是用来加密信息的,确保只有特定的人(用谁的公钥就是谁)才能解密该信息。
下面我拿A银行和小明来举例子吧。
假设这2者之间是用不对称的加密算法来保证信息传输的安全性(不被第三人知道信息的含义及篡改信息)。大致流程如下:
首先小明发了一条信息给A银行“我要存500元”。这条信息小明会根据A银行的对外发布的公钥把这条信息加密了,加密之后,变成“XXXXXXX”发给A银行。中间被第三者截获,由于没有A银行的私钥无法解密,不能知道信息的含义,也无法按正确的方式篡改。所以拿这条加密信息是没办法的。最后被A银行接受,A银行用自己的私钥去解密这条信息,解密成功,读取内容,执行操作。然后得知消息是小明发来的,便去拿小明的公钥,把“操作成功(或失败)”这条信息用小明的公钥加密,发给小明。同理最后小明用自己的私钥解开,得知知乎发来的信息内容。其他人截获因为没有小明的私钥所以也没有用。
私钥加密公钥解密
还有第二种情况,公钥是用来解密信息的,确保让别人知道这条信息是真的由我发布的,是完整正确的。接收者由此可知这条信息确实来自于拥有私钥的某人,这被称作数字签名,公钥的形式就是数字证书。怎么理解呢?
继续拿小明和银行A举例子。银行A发布了一个银行客户端的补丁供所有用户更新,那为了确保人家下载的是正确完整的客户端,银行A会为这个程序打上一个数字签名(就是用银行A的私钥对这个程序加密然后发布),你需要在你的电脑里装上银行A的数字证书(就是银行对外发布的公钥),然后下载好这个程序,数字证书会去解密这个程序的数字签名,解密成功,补丁得以使用。同时你能知道这个补丁确实是来自这个银行A,是由他发布的,而不是其他人发布的。
非对称加密原理
举一个最简单的例子,任何一个三位数乘以1001后,末三位都不变,例如$123 * 1001 = 123123$,而 91乘以11等于1001
以上例子中,91和11就是一对公私钥,比如私钥是91,公钥是11,我们用公钥加密私钥解密,字符串是123
- 公钥加密,$123 * 11 = 1353$,1353就是加密后的密文
- 将密文发送给私钥持有者,其他人由于没有私钥即使拿到密文也看不懂
- 私钥解密,将密文也就是1353再乘以私钥91,结果是123123,取后三位就是原始字符串
同样我们可以用私钥加密公钥解密,步骤是一样的,公钥私钥只是相对的,以上例子中都是1001的两个因子
知道这个原理后,我们可以构造一个定义域和值域更大的加密解密系统。比方说,任意一个数乘以400,000,001后,末8位(8位加密系统)都不变,而$400000001 = 19801 * 20201$,于是你来乘以19801,我来乘以20201,又一个加密解密不对称的系统就构造好了。
比方说加密一个8位以内的数,12345,$12345 * 400,000,001= 4938000012345 $ ,可以看到后5位就是原始内容
我们先加密,$12345 * 19801 = 244443345$
再解密,$244443345 * 20201 = 4938000012345$
甚至可以构造得更大一些:$4000,000,000,000,000,000,000,000,000,001 = 1199481995446957 * 3334772856269093$,这样我们就成功构造了一个30位的加密系统(对30位以内的数字进行加密解密)。
这是一件非常coooooooool的事情,任何人都可以按照我公布的方法加密一个数,但是只有我才知道怎么把所得的密文变回去。
其安全性就建立在算乘积非常容易,但是要把4000000000000000000000000000001分解成后面两个数相乘,在没有计算机的时代几乎不可能成功!但如果仅仅按照上面的思路,如果对方知道原理,知道我要构造出带很多0的数,根据19801和8位算法这2个条件非常容易穷举出400000001这个目标值。
要解决这个问题,真实世界就不是使用乘法了,比如RSA算法使用的是指数和取模运算,但本质上就是上面这套思想。
RSA加解密介绍
如何用通俗易懂的话来解释非对称加密? - 弃愚的回答 - 知乎 https://www.zhihu.com/question/33645891/answer/159643267