比特币技术笔记(2)密码学基础:非对称加密与哈希函数

本篇将重点介绍比特币的密码学基础:非对称加密、数字签名与哈希函数。

1.   非对称加密

信息加密的过程相信大多数人都理解:即信息发送者使用某个密码或者秘密的规则,将信息转化为第三方难以解读的乱码,即『密文』。然后将『密文』发送给接收者;接收者再通过对应的规则进行解密,得到信息原文。

最初的加密方法都是对称的:加密与解密都是用相同的密码(也称为『密钥』)。这就意味着当需要进行加密通讯时,通讯双方需要使用一个更加安全的方式来传递这个共用的『密钥』,而且双方需要互相信任对方不会将『密钥』泄露给第三方。事实上这给加密通讯带来了很大的风险,因为『密钥』很可能被有意或无意地披露给第三方,或被第三方暴力破解。

为了解决这个问题,『非对称加密算法被提出。它使用两套密码来处理加密通讯,这两套密码分别称为『私钥』和『公钥』,可以分别用于加密和解密信息:如果一个信息用『私钥』加密,那么这个信息仅能被『公钥』解密;反之如果一条信息被『公钥』加密,那么该信息只能被『私钥』解密。

在实际应用中『私钥』和『公钥』通过程序配对生成。『私钥』掌握在个人手中,『公钥』则公开发布给所有人。当其他人需要给此人发送加密信息时,只需要获取其『公钥』并利用它加密该信息即可。除了信息接收者外任何人都无法解密『公钥』加密后的信息。这便安全地实现了加密通讯

具体的加密过程可以通过以下过程描述:

A端(发送端):加密信息 <- B公钥(信息)
B端(接收端):信息原文 <- B私钥(加密信息)

任何人可以公开自己的公钥,并将私钥安全保管,即可实现更加安全的『非对称加密』。

2.   数字签名[1]

此外,非对称加密的公私钥也可反过来使用,即:信息发送者使用自己的『私钥』将信息加密,并发送给其他人。任何人都可以使用其『公钥』解密该信息并查看其内容。

需要注意的是,只有信息发送者持有其『私钥』。如果该信息能够被其『公钥』解密,则证明了该信息是由其对应的『私钥』所加密。换言之,证明了该信息来自于『公钥』对应的持有者本人。

这实现了一个新的功能:数字签名。即信息发送者通过『私钥』加密信息,来担保该信息的确来自于发送者自己。任何人收到有数字签名的信息,都可以通过信息发布者的『公钥』解密,来验证信息发送者的真实身份。

具体的签名过程可以通过以下过程描述:

A端(发送端):
数字签名 = A加密私钥(信息 )

B端(接收端):
信息,数字签名 = B解密私钥(加密信息)=B 解密私钥(B加密公钥(信息,数字签名))

『数字签名』是比特币的重要密码学基础之一。

3.   哈希函数

此外,比特币网络中面临着大量的信息验证的工作。最直观的信息验证方案就是:逐字对比。

但这存在一个问题,我们需要存储标准信息用于验证。而对于有数亿条交易记录的比特币网络,存储全部的交易信息会带来很大的存储负担。

比特币网络中使用哈希函数来简化验证信息的存储。

哈希(hash)函数也称为散列函数,它的功能是能够根据特殊的规则,将任意数据或信息转化为一个固定长度的字符串乱码。此外它能够保证,输入数据中任何微小的差异,都能导致输出字符串巨大的变化。以md5函数为例,计算‘hello world!’和‘hello world! ’两个字符串的哈希值:

md5(‘hello world!’) = fc3ff98e8c6a0d3087d515c0473f8677
md5(‘hello world! ’)= eb4a33b0b0d41186cbef17e0c383d9b0

可以发现,尽管多了一个空格字符,两个字符串的哈希值完全不一样。

因此,如果需要验证大量的数据(如交易记录),我们可以计算出这些数据的哈希值并存储下来(相比原始数据,哈希值的存储负担要小得多)。之后在需要验证这些数据时,只要比较这些数据计算出来的哈希值是否与已经存储下来的哈希值一致即可。由于任何微小的差异都会导致不同的哈希值,因此这是一个非常有效的验证方式。

[1] 《数字签名是什么?》 http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

标签:

发表评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据