密码技术
我们将简单讨论一下三种常见的密码技术:单项散列函数(One way hash function)、对称密码技术(Symmetric encryption)、公钥密码技术(Public key encryption),以及它们是怎么可以被用来满足这些需求的。
单向散列函数
单向散列函数是一种将任意长度的输入数值转换成另一个固定长度数值的数学函数,通常大家把转换后的数值叫哈希值。
图1:单向散列函数
单向散列函数有两个重要的特点:第一、整个过程是单向的,即无法从转换后的数值(哈希值)反向推断出原始的输入数值;第二、输入数值的任意微小变化,都会导致转换出完全不同的哈希值。
看到这两个特点,聪明的你是不是隐约觉得,单向散列函数可以用来检测篡改呢?如果把输入数值比作一个人,那么转换后的哈希值就是这个人的指纹(finger print)。图2展示了如何通过散列函数做完整性检测。
图2:完整性检测
对称密码技术
对称加密定义很简单:用同样的密钥对信息进行加密和解密。
如果你看过谍战片就很容易理解对称加密。两个情报人员分别拥有一本相同书。情报发送人员会在书中找到原始情报中的每一个字,这样就可以把情报中的每一个字转换成页码、行数、行中第几个字,例如1001015可以表示第100页第10行的第15个字。这样整份情报就被加密成只有数字的信息。
情报接收人员就会根据这些数字和那本书,将加密后的情报解密成原始情报。这就是典型的对称加密,而两个情报人员都拥有的那本相同的书就是密钥。
对称加密有两个主要用途:信息加密和消息认证码。
对称密码技术-加密
当用于加密时,发送方在发送之前用密钥对明文信息进行加密,然后发送给接收方。接收方接收到加密信息后,用相同的密钥把加密信息解密成明文信息。
对称密码技术的加密用途能够满足保密性的需求。
图3:对称加密
对称加密-消息认证码
消息认证码(MAC-Message Authentication Code)和单向散列函数相似,能将任意长度的输入数值转换成另一个固定长度数值,通常大家把转换后的数值叫MAC值。同样,对输入的任意改动都会导致输出完全不同的MAC值。
消息认证码与单向散列函数不同之处在于,消息认证码同时需要密钥作为输入。如图2所示,原始信息和密钥同时作为输入,通过消息认证码转换成固定长度的MAC值。
图4:消息认证码
和单向散列函数一样,消息认证码可以用来满足完整性需求。同时由于消息认证码额外需要密钥作为输入,使得其同时具备身份验证的能力。那消息认证码是怎么工作的呢?
如果图5所示,消息发送方和接收方都持有相同的密钥。消息发送方将需要发送的消息和密钥作为输入计算出MAC值,然后将消息和MAC值一起发送给消息接收方。
消息接收方将接收到的消息和持有的密钥转换成MAC值。如果这个MAC值和接受到MAC值相等,则说明消息来自于持有同样密钥的人(身份验证),且在传输过程中没有被篡改过(完整性)。
图5:消息认证码的工作机制
对称加密有加密、解密速度快的特点,因此比较适合满足信息传输保密性需求。同时由于加密和解密采用相同密钥的特点,导致密钥分发变得困难,因为如果密钥在分发过程中被复制,那么信息传输就不再安全。另外由于对称加密会有两人或多人拥有相同的密钥,这导致其无法做到不可抵赖性,因为我们无法判断信息或文档来自于哪一个密钥持有者。
优点:
·加密、解密速度快
缺点:
·密钥分发困难
·无法满足不可抵赖性需求
公钥密码技术
公钥加密技术其实是一种非对称加密技术,公钥加密采用公钥和私钥密码对来进行加密和解密。公钥加密的特点是:用公钥加密的数据只能用对应的私钥解密,用私钥加密的数据只能用对应的公钥解密。
那私钥到底是什么呢?私钥其实是一个极其大且很随机的一个数,它只能被所有者持有且需要妥善保管不能泄露,因此称为私钥。
公钥也是一个很大的数,公钥是从私钥推算出来的。推算是单向的,因此无法从公钥推算出私钥。公钥可以公开的分发给其它人,因此称为公钥。
公钥加密技术有两个主要的用途:加密和数字签名。
公钥密码技术-加密
当用于加密时,信息发送者用公钥对明文信息进行加密,信息接受者用私钥解密。由于用公钥加密的信息只能用对应的私钥来解密,所以公钥可以随意公开的分发。公钥即便落入坏人的手中,他们也无法用获取的公钥解密用公钥加密的信息。这克服了对称加密密钥分发困难的问题。
公钥加密技术的加密用途能够满足保密性的需求。
图6:公钥加密技术-加密
公钥密码技术-数字签名
数字签名可以用于验证数字信息或文档的真实性。这里的真实性包含几层意思:第一、数字信息或文档的来源是否可靠,比如它是不是来自于宣称的那个人或组织(身份验证和不可抵赖);第二、数字信息或文档是否被篡改过(数据完整性)。
你会发现这和我们在数字证书-需求篇中讨论的在合同上签字是一样的效果。数字签名可以用来满足完整性、身份验证以及不可抵赖性的需求。
那数字签名是怎么工作的呢?下图7展示了数字签名是如何工作的。从图中可以看出数字签名分签名和验证两个阶段。
签名阶段
首先通过单向散列函数将文档内容转换成固定长度的哈希值;然后用私钥对哈希值进行加密,哈希值被加密后就变成了数字签名;最后将数字签名和文档放在一起就是数字签名过的文档。先将文档转换成哈希值再加密,相当于我们再签合同的时候,在合同页的侧面也签上名字。
验证阶段
首先用公钥将文档中的数字签名解密成哈希值;然后将文档内容(除去数字签名部分)通过单向散列函数转换成哈希值;最后通过比较两个哈希值是否相等,来判断文档是否被篡改过。
那么身份验证和不可抵赖性在这里是怎么体现的呢?我们知道私钥一定是和一个人或组织绑定的,而且用私钥加密的信息,只能用对应的公钥来解密。在验证阶段我们需要用公钥把数字签名解密成哈希值,如果解密成功,那么说明信息或文档一定来自于私钥的持有者,这就做到了身份验证和不可抵赖性。
图7:公钥加密技术-数字签名
优点
·满足身份验证需求
·满足不可抵赖性需求
·满足完整性需求
·公钥可以公开的分发
缺点
·加密、解密速度慢
·存在公钥认证问题(中间人攻击问题)