加密

161 阅读7分钟

加密分为 对称加密 和 非对称加密。\

1. 对称加密

现有A,B两人有书信往来,为了避免信件在邮寄过程中被人偷拆查看内容,双方约定,信中所涉及到的数字,写的人要 +7 处理,看得人要 -7 处理。

现在A给B写信:
我家有6只老母鸡,4只小羊羔,来我家杀鸡宰羊款待你。
翻译过来就是:
我家有-1只老母鸡,-3只小羊羔,来我家杀鸡宰羊款待你。

那么B看到了信就领悟了精神:A家啥玩意没有。

\

这个 “ + ” 就是算法(计算方法),这个“ 7 ”就是私钥,“6”和“4”就是密文,“-1”和“-3”就是原文(我们习惯叫明文), “ +7 ” 过程的复杂度决定了这种对称加密的安全性,复杂度越高,安全性越高,复杂度越低,安全性越低。


加密和编码的区别是什么?

编码为了降低解码成本(比如unicode)
加密为了正价解码成本

\

常用的对称加密方式AES加密


首先,AES加密 = 算法 + 私钥,也就是 “ + ” 和 “ 7 ”,只不过AES加密产出的算法和私钥都比较复杂,很难通过在没有算法和私钥的情况下由密文推理出明文。

但是,AES加密的算法是公开的,这和举的AB例子有本质区别,这就要求必须保证私钥安全。

下面就是前后端http协议通信时,通过对数据AES加密,避免明文传输的例子。

\

\

但是我们知道,黑客会通过DNS劫持等方式截取我们http请求\

\

\

\

算法和私钥都被黑客拿到,所以,单纯的AES加密安全性鸡肋。

写死在客户端更不行,JS文件没有安全性可言。

\

2. 非对称加密

假设:A与B要进行通信, C想窥探通信内容

B自己产出4个东西,加密算法 + 解密算法 + 公钥 + 私钥
其中 加密算法 + 解密算法 + 公钥 都被公开, 所以A 和 C都能获得

A通过 加密算法 + 公钥 对信件明文进行加密,可以简化成
加密(公钥 ,明文) = 密文

B拿到密文,通过解密算法 + 私钥 对密文进行解密,可以简化成
解密(私钥 ,密文) = 明文

C拿到密文,由于没有私钥,空有解密算法是不能得到明文的。

解密( XX ,密文) ≠ 明文

**
**

【也可以用私钥加密,公钥解密】

\

常用的非对称加密方式RSA、ECC加密


RSA加密方式就是上述的ABC案例加密方式,他的大致算法如下:\

  1. 生成两个质数 p 和 q

  2. n = p × q

  3. φ(n) = (p - 1)×(q - 1)【欧拉函数】

  4. 公钥 = e

e的取值要求:
① 1< e < φ(n) 【且e为正整数】
② e 与 φ(n) 互质

5.私钥 = d

d的取值要求:
① e × d ÷ φ(n) ........... 余 1

6.加密算法 = me ÷ n 得余数=> c 【其中m为明文,c为密文】
7.解密算法 = cd ÷ n 得余数=> m 【其中m为明文,c为密文】

\

总之RSA的核心就是因式分解,简单说就是知道p 和 q就能破解密文,且n 是已知的 ,例如 n = 15, p和q就是 3,5 或者 5,3,很简单就破解了,但是 n = 33609608874827 你来算算 p 和 q(答案是 24036583 × 1398269,摘自梅森素数)

n = 103835296409081751860770535514746586815395898427260334325680313648369132661057840680823295512236948953370895568419721331170834557812541468309298819497267746892814583806423027167382825479157951365823085639078738847647634406841331307035593810712914545347201619004253602692127370265833092082543067153606828049061 呢?(答案是 10169921435575123642561867469669552661717864247752251361375671837367086221354750692635829007786009042729357644276462913457660789233674358081650339142863821 x
10210039189276167395636779557271057346691950991057423589319031237857569595284598319093522326723650646963251941930167018746859556383067696079622198265424441)
\

ECC加密利用的是椭圆曲线函数,其中之一的函数实例为:y^2 = x^3 + bx^2 + c

\

假设A点为(-5,2),B点为(1,5),那么A + B = (5,8)。
\

无论是RSA还是ECC,都是一样的套路,从A可以推出B,但是从B推不出A。这样可以保证私钥的安全性。

\

下面以RSA为例,介绍非对称加密使用流程。

\

\

\

但是安全问题依然得不到保证,因为中间人攻击依然有效。

\

\

动态获取公钥是有问题的,黑客劫持公钥后,自己生成一对公钥私钥,把自己的公钥发送给客户端,客户端拿到黑客的公钥进行加密,黑客拿到密文就能用自己的私钥解密。

\

为了防止拦截,有的公司的做法都是把公钥提前写死在客户端,用的时候直接加密就好了,不需要去服务端获取公钥,而且还少了一次http请求,提高了一点性能。
不过问题又来了,首先可能人为泄密,其次维护实在不方便。

\

\


对称加密与非对称加密的优缺点:

非对称加密消耗性能,但是保密性高;

对称加密消耗性能低,但是保密性相比非对称加密来说低很多;

\

3. HTTPS

\

\

\

返回证书这一步最重要,他解决了两个问题:

\

  1. 保证了客户端拿到的一定是服务端的公钥,而不是中间人的公钥。

中间人也有CA公钥,但是他解密、修改内容后,并不能加密成客户端能识别的秘文,因为中间人没有CA私钥。

  1. 防止中间人篡改数据

中间人虽不能将秘文的公钥替换成自己的公钥,但是他可以破坏数据,说白了就是“我拿不到,你也休想拿到”。

此时客户端可以通过 hash(服务器信息 + 服务器公钥)的值和证书解密的hash值进行对比,无论中间人修改了服务器信息 + 服务器公钥,还是修改了证书的hash值,或者两者都被修改了,客户端都能通过新的hash值进行对比,不相等就是篡改了。

有人问如果两者都被修改了,有没有可能新的hash值和证书里的hash值正巧相等呢?几乎不可能。

因为对于hash内容来说,只要修改一点,hash值就会面目全非,撞上这个大运基本不可能。

\

所以,证书验证既能验证数据来源,又能验证数据的完整性,保证了数据安全传递。