这里记录一下我对密码学的知识的了解:
- 先说一下基础的知识和术语
1.1.明文:指没有加密的字符串,一般人都能看懂的意思(如web开发中以http协议请求时,可通过抓包来获取到浏览器或服务器发送的数据包)。
1.2.密文:指经过某个加密算法,将明文变成其他字符串。从密文本身,一般不能看出明文本身的意思。不然就失去加密的意义。要想得到明文,就能通过对应的解密算法,才能得到明文,从而知道本来的意思。
1.3.加密算法和解密算法:指是将明文变成密文或密文变成明文的逻辑步骤。
1.4.密钥:指一种参数,它是在加密中或解密中输入的数据。
1.5.消息摘要:指唯一对应一个消息(字符串)的固定长度的值,它由一个消息摘要算法对消息进行作用而产生的。
特点:抗冲突性高,单向性的
抗冲突性使得如果一段明文稍有变化,哪怕只更改该段落的一个字母,通过消 息摘要算法作用后都将产生不同的值。
单向性是指无法从经消息摘要算法作用后产生的值,还原到消息本身。
作用:检验数据的完整性
消息摘要算法又叫散列算法,杂凑算法,消息摘要又叫散列值。常见的有MD2,MD4, MD5,SHA-1, SM3(国产的)等等。
1.6.对称加密和解密:指在加解密过程中,参数-->-密钥是相同的,即用的是相同的密钥。
相对于非对称加密和解密的优点:计算开销小,速度快。缺点是密钥管理困难,需要发送方采用安全的机制共享密钥。
加解密算法是公开的。常见的有DES,AES,3DES,SM1(国产),SM4(国产)等等
1.7.非对称加密和解密:指在加解密过程中,参数-->密钥是不相同的。其中一个密钥是公开的,发布出去给别人使用的,称为公钥;另一个密钥是保密的,称之为私钥。
特点:用公钥或私钥加密的密文,只能由私钥或公钥解密才可以得到相应的明文,否则,无法从密文中得到明文。
优点:便于密钥管理,分发。缺点是计算开销大,处理速度相对较慢。
加解密算法是公开的。常见的有RSA、DSA、ECC,SM2(国产)等等
1.8.数字签名/验签:
方式1:A要通过网络发送数据(C)给B:
a.A先将C用非对称私钥加密得到C0,
b.再将C0和C一起发送给B,
c.B用公钥解密C0得到明文,再与C做比较,若相同,说明传输过程中没有被人篡改内容。
方式1的流程图
方式2:a.先将数据C做消息摘要算法,得到消息摘要,
b.用私钥加密消息摘要得到密文C0,
c.再和C一起发送给B,
d.B用公钥解密C0得到消息摘要,再将C以相同的消息摘要算法计算得到消 息摘要,再做比较,若相同,说明传输过程中没有被人篡改内容。
方式2的流程图
可为什么不用对称加解密来实现呢?为什么不直接用摘要来实现呢?
这里就说到了数字签名/验签的作用了:
1.确定该数据包是由发送方发送的(私钥只有发送方才有的,只要用公钥解密后, 两者数据包相同,过程称为验签。就可以确定是发送者发送的)。
2.确定该数据包在传输的过程中没有被修改(被黑客操作了)。
这里举个案例
场景:A要与B通信,并且保证数据的安全传输
要求:1.确保通信双方是彼此;
2.确保通信内容不被别人知道(即使被抓包,也无法知道消息内容)
3.内容在传输中若被修改,接收方在接受数据后可以知道
以上是信息安全传输的最基本要求。
分析:数字签名正好可以解决要求1的问题,私钥只有发送方有,发送方发送一个数字签名包,若接收方能用对应的公钥验签成功,就可以说明发送方是与之通信的一方。
要求2是不可以用数字签名的方式来解决的,因为消息明文也在数字签名数据包中。
要求3就不说了,true&&false --------->已经是false了(短路运算)。
通过上面分析,若只通过一次交互就满足上述的3个要求,显然不太可能。所以解决的办法 只有通过多次的交互,来满足这3个要求。
步骤1:先确认通信双方的身份(要求1),这个可以通过数字签名来实现
步骤2:要确保内容不被别人知道,不能采用非对称加密的方式(因为公钥是公开的),这里采用对称加密的方式(加密算法和密钥应该是在会话的过程中临时产生,保存在内存中的)。通信双发需要商量两者都支持的
对称加密类型。
步骤3:要确保内容传输中被修改后,接收方能够知道,可以采用对消息做消息摘要,然后再用对称加密消息本身和消息摘要。
总结:双方发送数字签名包,作用:1.确定通信双方的身份;2.协商好一个对称加密类型(算法);3.协商好一个摘要算法类型
双方通过数字信封来传递对称密钥(双方只确定了对称加密的类型,还需要密钥才 可以进行对称加解密)。
数字信封:
上图是带数字签名的数字信封(好处是既有通信双发的身份确认,有可以确保对称密钥的可靠传输;缺点是A所支持的对称加密类型算法,B都支持),不适合本文讲述的应用场景。所以采用不带数字签名的数字
信封,如下图:
现在还有一个问题没有解决:A的私钥对应的公钥,B如何获得;B的私钥对应的公钥, A如何获得?因为A和B之间可能没有任何的联系,如浏览器与某一台web服务器。
这里采用数字证书的方式来解决。
数字证书:
干什么的:1.可以确保身份
2.可以使接收者安全的接收发送方的公钥
怎么生成的:这里说一个组织(CA),简而言之就是一个给人发数字证书的这么一个机构。B需要证书,B提交申请给CA,CA会审核,通过后就会给你发一个证书。过程就不介绍了(自行google)。说一下证书里面的主要
信息(如下图)
颁发者:一般就是指CA了
有效期:证书的寿命
使用者:就是申请者了
公钥:申请者私钥对应的公钥
签名哈希算法:数字证书的摘要算法
指纹:CA的私钥对证书的摘要值得加密值(签名值)
签名算法:CA的非对称加密算法类型
指纹算法:证书的摘要算法
大致产生证书的过程:申请者B提交数据给CA(申请者的公钥,申请者的说明等),CA审核通过后,会对申请者提交的数据以一定数据格式封装,再用CA的私钥做数字签名(带摘要的签名),然后再给到申请者B,供B通
信用。
A得到B的数字证书后,怎么确保B的呢?A的操作系统在安装时就已经有了CA的一个数字证书(跟着系统来的),A只需要从CA证书中取出CA的公钥,用公钥去解密指纹,再用指纹算法去对整个证书做摘要,然后比较两者的
摘要是否相同即可(CA证书可通过ie浏览器---->internet选项------>内容------>证书)。
暂时就到了,第一次写博客,写了好几个小时,文中有误的地方,欢迎指出。后面会举例:https网站的交互(密码学的一种应用)。