白话区块链技术 第2讲|非对称加密
Posted 币须说
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了白话区块链技术 第2讲|非对称加密相关的知识,希望对你有一定的参考价值。
欢迎来到《白话区块链技术》专栏第二讲。
具体的算法公式我们不多讲,我们这里只列出几种常用的算法,了解其中的基本原理。在学习初期,大家没必要知道算法的具体公式,但是一定要了解算法的基本原理,这样才能在区块开发中灵活运用。
一、对称加密
1.1.DES
数据加密算法(Data Encryption Standard)是一种对称加密算法,很可能是使用最广泛的密钥系统,特别是在保护金融数据的安全中,最初开发的DES是嵌入硬件中的。
输入:key(密钥)、data(加密数据 64位)、mode(加密方式 加密/解密)。
输出:des_data(加密后的数据)。
加密流程:对64位数据的各位进行重新排列组合,然后与密钥进行运算,循环迭代。
加密步骤:
1> 初始转换:把输入的64位明文换一定的规则打乱次序,分成左右各32位。
2> 循环加密:用子密钥对明文进行16轮加密运算,每轮用的子密钥都是不同的,但是各子密钥是有关联的,因为这些子密钥都是从原始密钥通过一定规则推导出来的。
3> 逆置换:对第二步得到的结果进行逆置换,即把结果再换一定顺序排列,这里的排序规则正好与第一步的排序规则互逆,因此叫逆置换。
4> 输出密文。
1.2. AES
高级加密标准(Advanced Encryption Standard),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:
二、非对称加密
2.1. ECC
Elliptic Curves Cryptography, 椭圆曲线加密。比特币等大多数区块链系统都使用ECC算法生成公钥与私钥,比特币选择的是secp256k1曲线。
ECC算法就是一个高度复杂的数学公式,并且其是一个单向计算过程。椭圆的通式为 y^2 = x^3 + a*x + b mod p,以及一个无穷大的数,当然最正宗的定义还有限定条件,该曲线是在有限域上的,并且a,b和q之间也存在关系。
ECC是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点P,一个整数k,求解Q=kP很容易;给定一个点P、Q,知道Q=kP,求整数k确是一个难题。
私钥,我们在上一节里已经讲过,是一串随机字符串,共256位,32个字节。公钥的生成就是用了ECC算法来得到。在这里Q就是我们的公钥,K就是私钥。
使用ECC算法能保证我们私钥到公钥的生成是单向的:根据私钥生成公钥容易,根据公钥生成私钥困难。
2.2. ECDH
elliptic curves Diffie-Hellman,是一种密钥协商算法,而不是加解密算法。还记得我们在上一节里说过的SSL协议中,在对称密码的协商阶段,我们使用的是非对称加密的方法,当时简单说明是用公钥加密。如果非对称加密采用的是ECC算法的话,那对称密码的协商,我们就不得不用到ECDH算法。
假设密钥交换双方为Alice、Bob,他们有共享曲线参数,即是通过同样的曲线来生成公、私钥。
1> Alice拥有公钥PA,私钥SA,Bob拥有公钥PB,私钥SB
2> Alice将自己的公钥PA传给Bob
3> Bob将自己的公钥PB传给Alice
4> Alice通过自己的私钥SA与Bob的公钥PB生生成一个密钥QA,QA=F(SA,PB)
5> Bob通过自己的私钥SB与Alice的公钥PA生生成一个密钥QB,QB=F(SB,PA)
根据算法,我们可以看到这样的结果:QA == QB
这时,Alice与Bob就得到了一个同样的密钥Q。这个密钥就可以对传输数据进行加密,解决了共同密码的协商问题,由于在协商的过程中只是暴露了各自的公钥,因此是安全的。
简单来说ECDH的精髓就在于:基于不同的公私钥对生成一样的密钥。
2.3. ECDSA
椭圆曲线数字签名算法,是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟。
这里需要注意的是:ECDSA签名算法的输入是数据的哈希值,而不是数据的本身,至于哈希算法选用哪一个就取决于自己了。为了使得ECDSA的输入值的bit数和子群的阶n的bit数一样,哈希值可能会被截断。
在这里,我们把ECDSA输入称之为Z。
经常用到的场景是这样的:Alice要用私钥签名一个数据,Bob想要使用Alice的公钥验证这个签名;
这里我们要明白:只有Alice能够进行计算然后得到签名,因为Alice掌握着私钥;而由于公钥是公开给所有人的,所以每个人都能验证签名值。
算法工作流程如下:
1> 取一个范围在[1, n - 1]的随机数k
2> 计算点P=kG
3> 计算r = xp mod n
4> 如果 r == 0,执行第一步
5> 计算s = k^-1 (z + r*da) mod n (da是Alice的公钥,k^-1 是 k 对n的逆元)
6> 如果s==0,执行第一步
7> 二元组(r, s)就是签名值
Bob使用Alice的公钥对(r, s)和Z进行验证,现在我们来看看Bob如何验证的:
1> 计算u1 = s^-1 * z mod n
2> 计算u2 = s^-1 * r mod n
3> 计算P = u1*G + u2*Ha
4> 如果r == xp mod n,则验证正确
2.4. RSA
RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的, 在公开密钥加密和电子商业中RSA被广泛使用。
RSA的理论基础是这样的:在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥SK是由公开密钥PK决定的,由于无法计算出大数n的欧拉函数phi(N),所以不能根据PK计算出SK。
注意: 在RSA里,是可以直接用公钥进行加密,私钥进行解密的,这里是与ECC中的ECDH是不同的,在ECDH里,是借用了已方私钥、对方公钥来生成一个共有密钥,而用这个协商好的密钥来进行加解密的。
在这们学习之初,要明白的是DES与AES属于对称加密,AES是DES的加强版本,因为A是Advanced;ECC与RSA是非对称加密,但是加密方式是不一样的。对于RSA来讲:公钥加密、私钥解密,私钥签名、公钥验签。对于ECC来讲,ECDH来协助加密与解密,ECDSA实现了私钥签名、公钥验签。
上面的几种算法的具体数学实现,有兴趣的读者可以自己查找,我们在这里只是了解概念,知道各个算法的侧重点与区别,有助于我们在以后的区块链学习不会出现概念上的混淆,尤其要区分RSA的加解密与ECDH。
好,我们下周二开始新的话题,下周见。
没看够?再来几篇
本期作者|王 毅
本期编辑|靳亚峰
祝你晚安早安午安心安
你可以上哪儿找我?
▽
以上是关于白话区块链技术 第2讲|非对称加密的主要内容,如果未能解决你的问题,请参考以下文章