消息认证的目的是验证消息的完整性和确认消息的来源。数字签名的目的是不仅验证消息的完整性和来源,还提供了不可否认性。此外,数字签名还可以验证消息的创建时间,防止重放攻击。那么具体有哪些实现的方式呢?
一、仅提供消息认证
(1)方式一:通过对称密钥实现
Alice和Bob进行通信,在通信之前双方共享了对称密钥K
首先Alice把消息明文进行哈希运算得到哈希值H,将哈希值用对称密钥进行加密的到哈希值的密文E,再将哈希值的密文与消息的明文进行拼接,通过公开信道发送给Bob。
然后,Bob拿到数据后将加密的哈希值通过对称密钥K进行解密,得到解密后的哈希值D,同时Bob还得把消息M自己做一次哈希运算也得到一个哈希值H。对比这两个哈希值是否相等,就可以判断出消息是否有可信的实体发来,并且判断出消息是否完整。
(2)方式二:通过MAC实现
Alice和Bob进行通信,在通信之前双方共享了一个随机数S(这个随机数可以理解为只有Alice和Bob才知道的一个秘密,也可以理解为一个密钥,但这个密钥不是用来加解密的)
首先Alice将明文与随机数S拼接起来,对拼接后的信息进行哈希运算得到,然后将MAC与消息的明文M一起发给Bob
Bob收到后,他也将消息的明文与随机数S拼在一起做哈希运算,得到一个MAC。然后拿他算出的MAC与他从Alice处得到MAC做比较。如果相等就可以认为消息内容是完整的没有被篡改,消息的来源是可信的。
二、既提供加密又提供消息认证
(1)方式一:通过MDC与对称加密实现
Alice和Bob进行通信,在通信之前双方共享了对称密钥K
Alice对消息明文进行哈希运算,得到哈希值H(也就是MDC),在将哈希值与明文拼在一起用对称加密的密钥K进行加密,得到密文。然后Alice将密文通过公开信道传给Bob
Bob得到了密文后,先拿对称密钥K进行解密,得到拼起来的两部分:一部分是消息明文M,第二部分是个哈希值H(也就是MDC)。此时,Bob他自己对消息明文M进行哈希运算得到哈希值H,然后拿他算出来的哈希值H与解密出来的哈希值H进行对比。
在这种方式中,公开信道里传递的是密文,保证了消息的机密性。两个哈希值对比相同的话,保证了消息的完整性。而消息来源的真实性是通过对称密钥K只有可信用户才拥有来实现的。
(2)方式二:通过MAC与对称加密实现
Alice和Bob进行通信,在通信之前双方共享了对称密钥K和随机数S
首先Alice将消息明文M与随机数S拼接后进行哈希运算的到MAC,再将MAC与消息明文M拼接后拿对称密钥K进行加密得到密文。于是Alice就可以把密文通过公开信道发给Bob
Bob收到密文后,通过手里的对称密钥K进行解密,解密出来的东西是两部分:第一部分是消息明文M,第二部分是MAC。此时,Bob需要把消息明文M与随机数S拼接再进行哈希运算得到MAC,拿着Bob自己算出来的MAC与解密得到的MAC进行对比。
在这种方式中,公开信道里传递的是密文,保证了消息的机密性。MAC对比相同的话,保证了消息的完整性和消息来源的真实性。此时消息来源的真实性是通过MAC实现的。因为MAC只有拥有S的人才能正确生成。而拥有S的人可以认为是可信任的人。
【注】本文中上图的方式是先MAC再加密,也可以先加密再MAC。效果是一样的就不赘述,用一个图来展示一下即可。
三、既提供了消息认证,又提供了数字签名
(1)方式:通过MDC与公钥密码体制实现
Alice和Bob进行通信,事先他们各自生成公私密钥对,并将各自的公钥公布出来。
Alice对消息明文M进行哈希运算,得到哈希值H(也就是MDC),再用自己的私钥对哈希值进行签名生成一个密文S,再将S与明文M拼在一起通过公开信道传给Bob
Bob收到了消息明文M后,自己计算。于此同时他还需要在公钥数据库中找到Alice的公钥对签名进行解密,一旦成功解密则可以得到一个MDC,拿解密出来的MDC与他自己算出来的MDC进行比对即可验证消息的完整性。
这种方式中,消息的完整性是通过MDC实现的,消息来源的真实性是通过公钥密码体制的数字签名实现的。因为是Alice拿自己的私钥签名,所以实现了消息的不可否认性。
四、既提供了消息认证,又提供了数字签名,还提供了保密性
(1)方式:通过MDC与混合密码体制实现
Alice和Bob进行通信,事先他们各自生成公私密钥对,并将各自的公钥公布出来。并且他们实现共享了对称密钥K
Alice首先把明文M进行哈希运算得到MDC,然后利用自己的私钥对MDC进行加密。再将消息明文M与加密后的MDC拼接起来,再用对称密钥K进行加密,得到最终要发送的密文E,并把E通过公开信道发给Bob
Bob得到密文后,用对称密钥K进行解密,他此时会得到两个部分:第一个部分是消息明文M,第二个部分是一个密文。然后,Bob去公钥数据库中找到Alice的公钥对这个密文进行解密,一旦成功解密就意味着这个消息是Alice发来的,否则就不是。
此时,通过Alice公钥解密出来的东西是一个MDC,那么接下来,Bob需要自己将消息明文M进行哈希运算得到一个MDC与解密出来的MDC进行比对。如果比对成功,说明消息未被篡改,确保了消息的完整性。
在这个方式中,消息的完整性通过MDC来确保,消息的不可否认性通过公钥密码体制的数字签名来确保,消息的机密性通过对称密码体制来确保。消息的来源真实性通过数字签名确保。