通俗易懂的记录下自己对俩个加密原理的理解和实际项目中主要采用的加密方式
网络安全主要包括四点:
1.机密性:即我们常说的加密,解密
2.报文完整性:保证不被别人篡改
3.端点鉴别:证实对方确实有他们声称的身份
4.运行安全性:防火墙
一.对称密钥密码体系
发送方和接收方共享密钥
流密码用于无线LAN
块密码用于多种因特网协议加密,如:PGP(安全电子邮件),SSL(更安全的TCP),IPsec(更安全的网络层传输)
1.块密码
块密码将报文按块划分,比如一个块3比特,一个块64比特
简单示例:
三比特块密码映射表示例:
输入 | 输出 | 输入 | 输出 |
000 | 110 | 100 | 011 |
001 | 111 | 101 | 010 |
010 | 101 | 110 | 000 |
011 | 100 | 111 | 001 |
这是一对一的映射,明文000对应密文110,想换个密文对应就要换一张表,能换多少种呢?可不是8种,其他明文对应密文变了那就又是一张新表了.所以要排列组合,8!=40320
即:k比特的块的映射表也就是可能的密钥有(2^k)!种.
一般都是64块,所以想穷举破解不太可能.
但是64位的表多大啊?怎么维护,所以现在
用函数来模拟随机排列表,代表算法:DES,3DES,AES
2.密码块连接
之前缺陷:相同明文会产生相同密文,容易被猜出来.
解决方案:为明文块生成随机数,然后跟明文做异或.相同明文产生不同密文.
新的缺陷:宽带直接翻倍.
解决方案:开头随机一个数跟明文块1作异或,生成密文块1,用密文块1跟明文块2作异或生成密文块2,连锁反应.这个开头随机数就叫初始向量.相比之前传输长度只加了一个数的长度.这种技术称为密码块链接技术(Cipher Block Chaining,CBC).
二.非对称密钥体系/公开密钥加密体系
经典算法:RSA
明文无论是用公钥加密私钥解密还是私钥加密公钥解密结果相同
可以不看,我只是搬来严谨点
这依赖俩个事实:
1).模运算
19 mod 5 =4 取余
[(a mod n) · (b mod n)] mod n = (a·b) mod n
2).数论
p和q是素数,且有n=pq和z=(p-1)(q-1),则 x^y mod n = [x^(y mod z)] mod n(麻了,数学太牛了)
RSA的安全性依赖于这个事实:
3).因数分解难!
生成公私钥的步骤
①选俩个大素数p,q越大破解越难
②n=pq 和 z=(p-1)(q-1)
③选一个小于n的一个数e,使e和z没有除1以外的公因数
④求一个数d,使ed-1可以被z整除即:ed mod z = 1
⑤(n,e)为公钥;(n,d)为私钥.加密:c = (m^e) mod n 解密:m = (c^d) mod n
证明:不写了.我们是程序员,不是数学家
三.报文完整性和数字签名
1.散列函数
常用算法:MD5(MD4为其前身),SHA-1(Security Hash Algorithm)
使用方法:
①报文m使用算法生成散列H(m).
②m+H(m)即:明文+散列一起发送过去,报文为(m,H(m))
③收到报文(m,h)后验证散列,计算H(m)=h,则报文完整
已知缺点:算法已知,m直接替换m1生成H(m1),验证也发现不了任何问题
改进方案:使用秘密串s,称为鉴别密钥(Authentication Key),这个密钥是秘密的,不会被外人知道.
使用方法:
①用m+s生成散列为H(m+s),散列H(m+s)称为报文鉴别码(Message Authentication Code,MAC)
②还是用m+H(m+s)发送,报文为(m,H(m+s)).
③因为s即鉴别密钥是秘密的,同样验证成功后就一定是完整的,未被篡改的
目前最流行的标准HMAC
2.数字签名
用私钥加密即为加签.
同样三步:
①m用私钥s加密生成签名H(m)
②发送(m,H(m))
③收到(m,h)用公钥解密h得到m,验证成功
项目中对接其中一个公司的加密
其中另一个公司的加密,其实不是很规范,直接发送签名串,利用了能用公钥解开就是正确的加密特性,与传统验签比少了对比明文的过程.
缺点:完整加密太费性能
改进方案:先对明文m使用散列,再加签,然后明文和签名一起发送
验证:明文m的散列=公钥解密签名
这种需要用私钥加签的,公钥一定要有认证,在我的项目中,与其他公司对接公钥证书就是从认证中心(Certification Authority, CA)申请的.CA对公钥签名,我们用CA来验证这个公钥可信.
我对接的俩家公司采用的加密过程,标准的先摘要再加签,最后明文签名一起发送