我近期在研究区块链技术,密码学和传统加密技术被反复提及,因此进行了一些回顾。
加密技术
加密方法可以分为两大类。一类是单钥加密(private key cryptography),还有一类叫做双钥加密(public key cryptography)。前者的加密和解密过程都用同一套密码,后者的加密和解密过程用的是两套密码。现行的双钥加密技术中,密钥有两把,一把是公开的公钥,还有一把是不公开的私钥。
双钥加密的原理如下:
a) 公钥和私钥是一一对应的关系,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立。
b) 所有的(公钥, 私钥)对都是不同的。
c) 用公钥可以解开私钥加密的信息,反之亦成立。
d) 同时生成公钥和私钥应该相对比较容易,但是从公钥推算出私钥,应该是很困难或者是不可能的。
与上述原理对应的,在中本聪论文[1]所提到签名及验证详细流程一般涉及以下几个步骤[2],这几个步骤即可由签名者也可由被签署信息的接受者来完成:
(1)用户生成或取得独一无二的加密密码组。
(2)发件人在计算机上准备一个信息(如以电子邮件的形式)。
(3)发件人用安全的哈希函数功能准备好“信息摘要”.数字签名由一个哈希函数结果值生成。该函数值由被签署的信息和一个给定的私人密码生成,并对其而言是独一无二的。为了确保哈希函数值的安全性,应该使通过任意信息和私人密码的组合而产生同样的数字签名的可能性为零。
(4)发件人通过使用私人密码将信息摘要加密。私人密码通过使用一种数学算法被应用在信息摘要文本中。数字签名包含被加密的信息摘要。
(5)发件人将数字签名附在信息之后。
(6)发件人将数字签名和信息(加密或未加密)发送给电子收件人。
(7)收件人使用发件人的公共密码确认发件人的电子签名。使用发件人的公共密码进行的认证证明信息排他性地来自于发件人。
(8)收件人使用同样安全的哈希函数功能创建信息的“信息摘要”。
(9)收件人比较两个信息摘要。假如两者相同,则收件人可以确信信息在签发后并未作任何改变。信息被签发后哪怕是有一个字节的改变,收件人创建的数据摘要与发件人创建的数据摘要都会有所不同。
(10)收件人从证明机构处获得认证证书(或者是通过信息发件人获得),这一证书用以确认发件人发出信息上的数字签名的真实性。证明机构在数字签名系统中是一个典型的受委托管理证明业务的第三方。该证书包含发件人的公共密码和姓名(以及其他可能的附加信息),由证明机构在其上进行数字签名。
其中,第(1)~(6)是数字签名的制作过程,(7)~(10)是数字签名的核实过程。
简单来讲,数字签名以及验证技术原理可拆解为下面流程:
签名的实现过程:
输入:原文、私钥
输出:签名值
1、将原文做HASH
2、将HASH用私钥加密,结果就是签名值
验证签名的实现过程:
输入:签名值、原文、公钥
输出:是否验证通过
1、将原文做HASH1
2、将签名值用公钥解密,取得HASH2
3、将第1步的HASH1与第2步的HASH2做比较,两个HASH一样就验证通过,否则不通过
如果上面的内容还不能很好的解答你的疑惑,请移步David[2]的文章“What is a Digital Signature?”。他进行了十分生动形象的解释,我也会在后续博客中进行翻译。
参考:
[1] Bitcoin: A Peer-to-Peer Electronic Cash System
[3] What is a Digital Signature?