密码学 Cryptography

应用场景

消息会受到4中典型的威胁,分别是:被窃听,被篡改,被伪造,被否认。密码技术就是用来解决消息所面临的以上威胁的技术。对于以上威胁,采用的技术如下表所示:

威胁 被威胁的特性 解决技术
被窃听 私密性 加密技术
被篡改 完整性 单向散列函数、消息认证码、数字签名
被伪造 可认证性 消息认证码、数字签名
被否认 不可否认性 数字签名

通过加密技术,来解决消息被窃听的问题。消息在传输时采用密文传输,那么原始明文就不会被窃听者知道,保证了原始明文的私密性。例如 AES 和 RSA 就是典型的对称和公钥加密算法。

那么如何保证接收的消息与发送者所发的消息是一致的呢?使用单向散列函数对消息生成摘要来实现。也就是如果原始消息发生改动,那么消息的摘要也一定会改动,当我们得到数据时,对数据做消息摘要,对比发布的消息摘要,若一致,表示原始消息未被篡改!典型的场景我们在下载文件时,通常在下载页面都会提供一个摘要码,供我们校验。例如 MD5、SHA-1、SHA-2、SHA-3 都是典型的单向散列算法。

再继续,如何确定该消息是某个发送者发的,而不是其他人冒充TA发送的呢?此时就需要使用消息认证码技术来解决。最典型的消息认证码技术实现是基于单向散列函数的,只不过是在生成摘要时,加入一个特殊秘钥,再生成的散列值就称之为消息认证码。该特殊秘钥只有发送者和接收者知道,因此接收者可以确定消息是由发送者发送的。

还有一个问题,我们使用单向散列函数生成消息认证码时,使用了一个可以认证身份的特殊秘钥,但是该秘钥有至少两个人发送者和接收者知道,甚至是多人知道(如果存在多个发送或接收方),这就导致一个新的问题:如果发送者不承认消息是TA所发该如何处理(因为只要有特殊秘钥的用户都可生成一致的消息,比如接收者本人)?就需要使用数字签名技术。数字签名技术与消息摘要技术相比,采用了公钥算法来生成消息认证码。使用公钥算法可以保证只有发送者采用生成消息摘要的特殊秘钥(称之为私钥),而接收者可以通过与私钥配对的公钥来完成消息的认证,进而保证消息一定是发送者发送的,不可以被抵赖。

总的来说就是:

有 A,B 两人,A 对 B 说:“给我充个话费,号码是15100000000。”,这句话就是原始内容的明文。

若不希望其他人知道该内容,则 A 和 B 传递消息时,应该使用加密技术。

若不希望数据在传输过程中被 C 改为:“给我充个话费,号码是15122222222。”,需要使用单向散列函数生成消息摘要。

若 B 需要认证消息是 A 发送的,需要使用信息验证码技术,因为只有 A 和 B 会有特殊秘钥,也就是 A、B约定了一个暗号。

最后为了保证 A 不能抵赖(否认),就是当 B 向 A 索要100元话费时,A说:“消息不是我发的,也可能是你自己发的呀,因为你也知道暗号”,需要使用数字签名技术,因为是公钥加密技术,只有 A 才能机会生成该签名,而 B 只能验证该签名。

技术概览

如下图所示: