加密基础

  • wonesky
  • 更新于 2021-08-13 12:46
  • 阅读 3992

加密货币是基于密码学构建起来的,要理解加密货币需要先理解加密学的一些基本知识,本文将介绍加密学的几个基本概念。

加密货币是基于密码学构建起来的,要理解加密货币需要先理解加密学的一些基本知识,本文将介绍加密学的几个基本概念。

哈希

哈希算法(Hash)又称摘要算法(Digest),也叫提取数据指纹。哈希函数实现对任意一个输入数据进行计算,得到一个固定长度的输出摘要(哈希值)

哈希函数

这是一种单向算法,从源数据得到哈希值很简单,但从哈希值倒推出源数据非常困难。哈希算法的特点是:相同的输入数据一定得到相同的哈希值,输入数据只要稍微变动一点,得到的哈希值完全不同(安全的哈希算法)。利用这个特点,哈希算法常用于验证原始数据是否被篡改,校验数据的完整性。比如我们在官网下载一些开源软件的时候,经常能看到软件的哈希值,你下载软件后通过计算其哈希值来验证所下载的软件是否被恶意修改过。常用哈希算法有:MD5(128bits)、SHA1(160bits)、SHA256、SHA512等。

可能你有个疑问,哈希值的长度是固定的,输入数据是无限的,那不同的输入数据的哈希值一定不同吗?不能保证一定不相同,只能保证大概率是不同的,概率的大小看哈希函数的实现。两个不同的输入数据,得到相同的哈希值,这就是哈希碰撞,上面提到的MD5和SHA1就已经被证明不是安全的实现。2005年山东大学的王小云教授发布算法可以轻易构造MD5碰撞实例,此后2007年,有国外学者在王小云教授算法的基础上,提出了更进一步的MD5前缀碰撞构造算法“chosen prefix collision”。所以MD5碰撞很容易构造,基于MD5来验证数据完整性已不可靠。SHA-256的理论碰撞概率是:尝试2的130次方的随机输入,有99.8%的概率碰撞。注意2130是一个非常大的数字,大约是1361万亿亿亿亿。以现有的计算机的计算能力,是不可能在短期内破解的。

在比特币使用的两种哈希算法:

  • 一种是对数据进行两次SHA-256计算,这种算法在比特币协议中通常被称为hash256或者dhash。
  • 另一种算法是先计算SHA-256,再计算RipeMD160,这种算法在比特币协议中通常被称为hash160。

对称加密

所谓对称加密就是:加密和解密使用同一个密钥。我们常用的密码系统就是对称加密,比如:你对一个文件进行加密,输入的密码就是密钥,加密后的文件,如果你想查看,还是使用相同的密码进行解密查看。常用算法:3DES(Triple DES)、AES(128bits, 192bits, 256bits, 384bits)、Blowfish、RC6...

使用对称加密,如果是自己使用,完全没问题,足够强度的密码破解也是非常困难。如果想要在多人之间传递这个秘密,就需要多人都知道这个密码,这个时候对密码的泄露管控就变得困难了。密钥的保存变得很重要,一旦密钥泄漏,秘密也就被破解。

非对称加密

非对称加密又称公钥密码学,加密和解密过程使用的是不同的密钥,密钥是成对出现的,分为公钥与私钥。

  • 私钥:secret key,通过工具创建,使用者自己留存,必须保证其私密性;
  • 公钥:pubkey,从私钥中提取产生,可公开给所有人;
  • 特性:用公钥加密的数据,只能使用与之配对儿的私钥解密,反之使用私钥加密的数据,只能使用与之对应的公钥解密;

非对称加密往往需要密码学安全伪随机数生成器的协助来产生一对密钥,随机数的产生对密钥的安全至关重要。下图是密钥的生成过程:

key pair

公钥密码学常被用在以下场景:

  • 数字签名:主要在于让接收方确认发送方的身份;
  • 密钥交换:发送方用对方公钥加密一个对称密钥,并发送给对方;
  • 数据加密:比对称加密要慢;

数据加密通常使用公钥加密,私钥解密;而数字签名使用私钥加密,公钥解密验证。常用算法:RSA(即可签名,也可加解密)、DSA(只能签名,不可加解密)、ELGamal...

在比特币系统中,我们用公钥密码学技术创建一个密钥对,用于控制对比特币的访问。密钥对包括一个私钥,和由其衍生出的唯一的公钥。公钥用于接收比特币,而私钥用于支付时进行交易签名。

公钥加密

如何使用公钥和私钥对数据加密传输呢?举个例子,Alice和Bob各自拥有一对公钥和私钥,公钥是可以公开的,他们都知道对方的公钥,那么Bob向Alice发送加密消息的过程如下:

  1. Bob使用Alice的公钥对源明文消息进行加密
  2. 把加密后的密文发送给Alice
  3. Alice得到密文后使用自己的私钥进行解密,得到消息的原文

如果Alice保护好自己的私钥没被泄露,这样在传输的过程中即使有人截获消息,也无法破解。

Public key encryption

数字签名

公钥密码学最常用的是进行数字签名,签名的目的是为了证明:该消息确实是由持有私钥的人发出的,任何其他人都可以对签名进行验证,即使用私钥加密,使用公钥进行验证。

举个例子:Alice对“Hello Bob!”这条消息(或一个合同)进行数字签名即使用私钥对这条消息进行加密得到签名signature,然后将这条消息和签名同时发出来,说是他发的这条消息,那么其他人该怎么证明Alice说的正确的呢?验证方法就是:其他人用Alice公开的公钥对签名signature进行解密,得到解密后的结果和这条消息相同,则说明Alice没有撒谎。过程如下图所示:

Private key signing

维基百科对 “数字签名 ”的定义:

数字签名是用于证明数字消息或文档的真实性的数学方案。 有效的数字签名使收件人有理由相信消息是由已知的发件人创建的(身份验证),发件人不能否认已发送的消息(不可否认性),并且消息在传输过程中没有更改(完整性)。

数字签名应用在互联网https上,通过CA证书确认你访问的网站时安全的,具体请看阮一峰翻译的数字签名是什么?

比特币中使用ECDSA(椭圆曲线数字签名算法),数字签名在比特币中有三种用途:第一,签名证明私钥的所有者,即资金所有者,有权花费这些资金。第二,授权证明是不可拒绝的(不可否认性)。第三,签名证明交易(或交易的具体部分)在签字之后没有也不能被任何人修改。

比特币网络处理的大多数交易都是由“付款至公钥哈希”或P2PKH脚本锁定的输出,这些输出都含有一个锁定脚本,将输入锁定为一个公钥哈希值,即我们常说的比特币地址。由P2PKH脚本锁定的输出可以通过提供一个公钥和由相应私钥创建的数字签名来解锁(花费)。

参考

点赞 5
收藏 1
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
wonesky
wonesky
江湖只有他的大名,没有他的介绍。