网络安全:加密算法
说到数据加密,最开始的起源是来自于英国的一次反叛,玛丽女王因为使用了低级的加密手法使得反叛的信息暴露而被处死。

而在计算机网络中,加密一般就是使用几种不同的技法,比如公钥私钥加密。
在电脑里,所有资料都是0和1的比特值阵列,完全可以通过数字的运算加密数据,常见的加密方式是RSA,这就是纯数学的东西,理解一下就是存在一个钥匙(理解成隧道),数据通过这个隧道之后就变成了加密过后的乱码,而隧道不一样,加密出来的东西也不一样,而让这个乱码再从隧道走回来,就能恢复成我们想要的东西。
对称加密
只有一个钥匙,就是公钥,数据加密和解密都用同一把钥匙
非对称加密
有一把私钥和公钥,必须配合使用才能加密解密,要么是私钥加密公钥解密,要么是公钥加密私钥解密
DH算法加密
两个人ALice和Bob,先选一个prime number和一个base g,然后Alice选一个a<p-1,Bob选一个b<p-1,分别计算 A = g^a mod p, B = g^b mod p。两个人交换数据,然后就能算出来私钥, K = (B)^a mod p , K = (A)^b mod p.
然后我们放在实际的应用里,在网络里,如果A给B发消息,需要提前传出自己的公钥或者私钥,倘若此时中间有一个人同时能听到两个人的消息,实际上他们说什么加密的信息,这个中间人都能解开,甚至包括DH算法。
而且这个人甚至还能代替A跟B聊天。

那你可能就想了,我让A和B约定一个密码,每次说完验证这个密码就可以,然而道高一尺魔高一丈,中间人可以记录这个密码实现replay攻击。

那么如何解决replay攻击呢?
我就使用一个随机的code,先发给A,然后让A用自己的私钥加密,传给我后我再用公钥解密,就能防止replay攻击。这个随机的code一生只用一次,叫nonce。

但是,如果有个人给你发消息声称他是A,你如何判断真假呢?
这时你就需要Digital Signature了。
如何做呢?
比如,我要发一个m信息给B,我就使用我自己的私钥加密m,然后把(m,私钥(m))发给B。
等到B收到后,使用我的公钥解密 第二个东西,看看和第一个东西一样不一样,如果一样,说明
- nonforgeable 不可以被伪造
- non-repudiation 不可以否认
- integrity:完整性
我特意标出来了 nonforgeable,其实这个是可以被伪造的,但是伪造之后的信息会成为乱码。

如何破局?
用哈希函数再加密一次!

PKI(Public Key Infrastructure)
我还是觉得传公钥不是很方便,如果在现实社会中,我只需要摆上我的身份证就能证明我是我了,那么效仿这个身份证系统,也有一个公钥系统,你只需要去CA注册拿到一个CA颁发的certificate,CA会用自己的private key加密,就成为了你想要的证书,后面,你只需要用CA的public key解密,看两个是否一致就能解决认证的问题。
参考HTTPS
