首先,SKa数字签名确保发送方的身份,再通过PKb加密,经过互联网的传输,接收方核实签名、解密。
但对较长的报文进行数字签名会加大计算机的计算量,需要较长时间。因此,提出了使用密码散列函数
即使H(X)被截获了,截获者也无法伪造出Y 使H(X)=H(Y)
改进后的加密过程如上图,对报文不需要加密,仅把散列H用密钥K加密。散列H的长度远小于报文X的长度,因此无需消耗很多计算资源。鉴别码MAC能够很方便地保护报文的完整性。
实体鉴别
对自己和通信方实体的一次验证,引入了不重数
1. A-->B 发送 其身份A,不重数RA。
2. B-->A 用共享密钥K[AB]加密后的不重数RA' , 并用B的私钥SK[B]进行签名RA' ,不重RB
// A用B的公钥PB[B]核实签名,就能得出自己发送的RA,核实了和自己通信的是B
3. A-->B 用共享密钥K[AB]加密后的不重数RB' ,并用A的私钥SK[A]进行签名RB'
// B用A的公钥PB[A]核实签名,就能得出自己发送的RB,核实了和自己通信的是A
但这种通信方式有个很大的缺陷---- 中间人攻击
1/ A发送身份A给B,被C截获 C --> B 2/ C原封不动把A的身份信息给B
C <-- B 3/ B选择不重数RB发给A,被C截获
4/ C把RB转发给A C --> B 5/ C用私钥SKc对RB加密后,发给B
6/ A用私钥SKa对RB加密后,发给B 被C丢弃 C <-- B 7/ B向A索要公钥PKA
8/ C向A索要公钥PKA C --> B 9/ C把自己的公钥PKc发给B,B以为收到的是A的公钥
10/ A向B发送自己的公钥PKA ,被C截获 C <-- B 11/ B把data用PKc加密后发给A
12.C收到data后用自己的私钥SKc解密,复制一份用PKA加密,发给A
13/ A收到C(以为是B)发来的data,用私钥SKa解密,得到data原数据