导航:首页 > 源码编译 > 比特币用的非对称算法

比特币用的非对称算法

发布时间:2023-01-17 03:29:17

1. 比特币如何防止篡改

比特币网络主要会通过以下两种技术保证用户签发的交易和历史上发生的交易不会被攻击者篡改:

2. 公钥、私钥、哈希、加密算法基础概念

生活中我们对文件要签名,签名的字迹每个人不一样,确保了独特性,当然这还会有模仿,那么对于重要文件再加盖个手印,指纹是独一无二的,保证了这份文件是我们个人所签署的。

那么在区块链世界里,对应的就是数字签名,数字签名涉及到公钥、私钥、哈希、加密算法这些基础概念。

首先加密算法分为对称加密算法、非对称加密算法、哈希函数加密算法三类。

所谓非对称加密算法,是指加密和解密用到的公钥和私钥是不同的,非对称加密算法依赖于求解一数学问题困难而验证一数学问题简单。

非对称加密系统,加密的称为公钥,解密的称为私钥,公钥加密,私钥解密、私钥签名,公钥验证。

比特币加密算法一共有两类:非对称加密算法(椭圆曲线加密算法)和哈希算法(SHA256,RIMPED160算法)

举一个例子来说明这个加密的过程:A给B发一个文件,B怎么知道他接收的文件是A发的原始文件?

A可以这样做,先对文件进行摘要处理(又称Hash,常见的哈希算法有MD5、SHA等)得到一串摘要信息,然后用自己的私钥将摘要信息加密同文件发给B,B收到加密串和文件后,再用A的公钥来解密加密串,得到原始文件的摘要信息,与此同时,对接收到的文件进行摘要处理,然后两个摘要信息进行对比,如果自己算出的摘要信息与收到的摘要信息一致,说明文件是A发过来的原始文件,没有被篡改。否则,就是被改过的。

数字签名有两个作用:
一是能确定消息确实是由发送方签名并发出来的;
二是数字签名能确定消息的完整性。

私钥用来创建一个数字签名,公钥用来让其他人核对私人密钥,
而数字签名做为一个媒介,证明你拥有密码,同时并不要求你将密码展示出来。

以下为概念的定义:

哈希(Hash):
二进制输入数据的一种数字指纹。
它是一种函数,通过它可以把任何数字或者字符串输入转化成一个固定长度的输出,它是单向输出,即非常难通过反向推导出输入值。
举一个简单的哈希函数的例子,比如数字17202的平方根是131.15639519291463,通过一个简单的哈希函数的输出,它给出这个计算结果的后面几位小数,如后几位的9291463,通过结果9291463我们几乎不可能推算出它是哪个输入值的输出。
现代加密哈希比如像SHA-256,比上面这个例子要复杂的多,相应它的安全性也更高,哈希用于指代这样一个函数的输出值。

私钥(Private key):
用来解锁对应(钱包)地址的一串字符,例如+。

公钥(Public keycryptography):
加密系统是一种加密手段,它的每一个私钥都有一个相对应的公钥,从公钥我们不能推算出私钥,并且被用其中一个密钥加密了的数据,可以被另外一个相对应的密钥解密。这套系统使得你可以先公布一个公钥给所有人,然后所有人就可以发送加密后的信息给你,而不需要预先交换密钥。

数字签名(Digital signature):
Digital signature数字签名是这样一个东西,它可以被附着在一条消息后面,证明这条消息的发送者就是和某个公钥相对应的一个私钥的所有人,同时可以保证私钥的秘密性。某人在检查签名的时候,将会使用公钥来解密被加密了的哈希值(译者注:这个哈希值是数据通过哈希运算得到的),并检查结果是否和这条信息的哈希值相吻合。如果信息被改动过,或者私钥是错误的话,哈希值就不会匹配。在比特币网络以外的世界,签名常常用于验证信息发送者的身份 – 人们公布他们自己的公钥,然后发送可以被公钥所验证的,已经通过私钥加密过的信息。

加密算法(encryption algorithm):
是一个函数,它使用一个加密钥匙,把一条信息转化成一串不可阅读的看似随机的字符串,这个流程是不可逆的,除非是知道私钥匙的人来操作。加密使得私密数据通过公共的因特网传输的时候不需要冒严重的被第三方知道传输的内容的风险。

哈希算法的大致加密流程
1、对原文进行补充和分割处理(一般分给为多个512位的文本,并进一步分割为16个32位的整数)。
2、初始化哈希值(一般分割为多个32位整数,例如SHA256就是256位的哈希值分解成8个32位整数)。
3、对哈希值进行计算(依赖于不同算法进行不同轮数的计算,每个512位文本都要经过这些轮数的计算)。

区块链中每一个数据块中包含了一次网络交易的信息,产生相关联数据块所使用的就是非对称加密技术。非对密加密技术的作用是验证信息的有效性和生成下一个区块,区块链上网络交易的信息是公开透明的,但是用户的身份信息是被高度加密的,只有经过用户授权,区块链才能得到该身份信息,从而保证了数据的安生性和个人信息的隐私性。

公钥和私钥在非对称加密机制里是成对存在的,公钥和私钥可以去相互验证对方,那么在比特币的世界里面,我们可以把地址理解为公钥,可以把签名、输密码的过程理解为私钥的签名。
每个矿工在拿到一笔转账交易时候都可以验证公钥和私钥到底是不是匹配的,如果他们是匹配的,这笔交易就是合法的,这样每一个人只需要保管好TA自己的私钥,知道自己的比特币地址和对方的比特币地址就能够安全的将比特币进行转账,不需要一个中心化的机构来验证对方发的比特币是不是真的。

3. 非对称加密算法 (RSA、DSA、ECC、DH)

非对称加密需要两个密钥:公钥(publickey) 和私钥 (privatekey)。公钥和私钥是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公钥进行解密。因为加密和解密用的是不同的密钥,所以称为非对称加密。

非对称加密算法的保密性好,它消除了最终用户交换密钥的需要。但是加解密速度要远远慢于对称加密,在某些极端情况下,甚至能比对称加密慢上1000倍。

算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就大了很多。

RSA、Elgamal、背包算法、Rabin、D-H、ECC (椭圆曲线加密算法)。使用最广泛的是 RSA 算法,Elgamal 是另一种常用的非对称加密算法。

收信者是唯一能够解开加密信息的人,因此收信者手里的必须是私钥。发信者手里的是公钥,其它人知道公钥没有关系,因为其它人发来的信息对收信者没有意义。

客户端需要将认证标识传送给服务器,此认证标识 (可能是一个随机数) 其它客户端可以知道,因此需要用私钥加密,客户端保存的是私钥。服务器端保存的是公钥,其它服务器知道公钥没有关系,因为客户端不需要登录其它服务器。

数字签名是为了表明信息没有受到伪造,确实是信息拥有者发出来的,附在信息原文的后面。就像手写的签名一样,具有不可抵赖性和简洁性。

简洁性:对信息原文做哈希运算,得到消息摘要,信息越短加密的耗时越少。

不可抵赖性:信息拥有者要保证签名的唯一性,必须是唯一能够加密消息摘要的人,因此必须用私钥加密 (就像字迹他人无法学会一样),得到签名。如果用公钥,那每个人都可以伪造签名了。

问题起源:对1和3,发信者怎么知道从网上获取的公钥就是真的?没有遭受中间人攻击?

这样就需要第三方机构来保证公钥的合法性,这个第三方机构就是 CA (Certificate Authority),证书中心。

CA 用自己的私钥对信息原文所有者发布的公钥和相关信息进行加密,得出的内容就是数字证书。

信息原文的所有者以后发布信息时,除了带上自己的签名,还带上数字证书,就可以保证信息不被篡改了。信息的接收者先用 CA给的公钥解出信息所有者的公钥,这样可以保证信息所有者的公钥是真正的公钥,然后就能通过该公钥证明数字签名是否真实了。

RSA 是目前最有影响力的公钥加密算法,该算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥,即公钥,而两个大素数组合成私钥。公钥是可发布的供任何人使用,私钥则为自己所有,供解密之用。

A 要把信息发给 B 为例,确定角色:A 为加密者,B 为解密者。首先由 B 随机确定一个 KEY,称之为私钥,将这个 KEY 始终保存在机器 B 中而不发出来;然后,由这个 KEY 计算出另一个 KEY,称之为公钥。这个公钥的特性是几乎不可能通过它自身计算出生成它的私钥。接下来通过网络把这个公钥传给 A,A 收到公钥后,利用公钥对信息加密,并把密文通过网络发送到 B,最后 B 利用已知的私钥,就能对密文进行解码了。以上就是 RSA 算法的工作流程。

由于进行的都是大数计算,使得 RSA 最快的情况也比 DES 慢上好几倍,无论是软件还是硬件实现。速度一直是 RSA 的缺陷。一般来说只用于少量数据加密。RSA 的速度是对应同样安全级别的对称密码算法的1/1000左右。

比起 DES 和其它对称算法来说,RSA 要慢得多。实际上一般使用一种对称算法来加密信息,然后用 RSA 来加密比较短的公钥,然后将用 RSA 加密的公钥和用对称算法加密的消息发送给接收方。

这样一来对随机数的要求就更高了,尤其对产生对称密码的要求非常高,否则的话可以越过 RSA 来直接攻击对称密码。

和其它加密过程一样,对 RSA 来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设 A 交给 B 一个公钥,并使 B 相信这是A 的公钥,并且 C 可以截下 A 和 B 之间的信息传递,那么 C 可以将自己的公钥传给 B,B 以为这是 A 的公钥。C 可以将所有 B 传递给 A 的消息截下来,将这个消息用自己的密钥解密,读这个消息,然后将这个消息再用 A 的公钥加密后传给 A。理论上 A 和 B 都不会发现 C 在偷听它们的消息,今天人们一般用数字认证来防止这样的攻击。

(1) 针对 RSA 最流行的攻击一般是基于大数因数分解。1999年,RSA-155 (512 bits) 被成功分解,花了五个月时间(约8000 MIPS 年)和224 CPU hours 在一台有3.2G 中央内存的 Cray C916计算机上完成。

RSA-158 表示如下:

2009年12月12日,编号为 RSA-768 (768 bits, 232 digits) 数也被成功分解。这一事件威胁了现通行的1024-bit 密钥的安全性,普遍认为用户应尽快升级到2048-bit 或以上。

RSA-768表示如下:

(2) 秀尔算法
量子计算里的秀尔算法能使穷举的效率大大的提高。由于 RSA 算法是基于大数分解 (无法抵抗穷举攻击),因此在未来量子计算能对 RSA 算法构成较大的威胁。一个拥有 N 量子位的量子计算机,每次可进行2^N 次运算,理论上讲,密钥为1024位长的 RSA 算法,用一台512量子比特位的量子计算机在1秒内即可破解。

DSA (Digital Signature Algorithm) 是 Schnorr 和 ElGamal 签名算法的变种,被美国 NIST 作为 DSS (DigitalSignature Standard)。 DSA 是基于整数有限域离散对数难题的。

简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名,如果数据和签名不匹配则认为验证失败。数字签名的作用就是校验数据在传输过程中不被修改,数字签名,是单向加密的升级。

椭圆加密算法(ECC)是一种公钥加密算法,最初由 Koblitz 和 Miller 两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成 Abel 加法群上椭圆离散对数的计算困难性。公钥密码体制根据其所依据的难题一般分为三类:大整数分解问题类、离散对数问题类、椭圆曲线类。有时也把椭圆曲线类归为离散对数类。

ECC 的主要优势是在某些情况下它比其他的方法使用更小的密钥 (比如 RSA),提供相当的或更高等级的安全。ECC 的另一个优势是可以定义群之间的双线性映射,基于 Weil 对或是 Tate 对;双线性映射已经在密码学中发现了大量的应用,例如基于身份的加密。不过一个缺点是加密和解密操作的实现比其他机制花费的时间长。

ECC 被广泛认为是在给定密钥长度的情况下,最强大的非对称算法,因此在对带宽要求十分紧的连接中会十分有用。

比特币钱包公钥的生成使用了椭圆曲线算法,通过椭圆曲线乘法可以从私钥计算得到公钥, 这是不可逆转的过程。

https://github.com/esxgx/easy-ecc

Java 中 Chipher、Signature、KeyPairGenerator、KeyAgreement、SecretKey 均不支持 ECC 算法。

https://www.jianshu.com/p/58c1750c6f22

DH,全称为"Diffie-Hellman",它是一种确保共享 KEY 安全穿越不安全网络的方法,也就是常说的密钥一致协议。由公开密钥密码体制的奠基人 Diffie 和 Hellman 所提出的一种思想。简单的说就是允许两名用户在公开媒体上交换信息以生成"一致"的、可以共享的密钥。也就是由甲方产出一对密钥 (公钥、私钥),乙方依照甲方公钥产生乙方密钥对 (公钥、私钥)。

以此为基线,作为数据传输保密基础,同时双方使用同一种对称加密算法构建本地密钥 (SecretKey) 对数据加密。这样,在互通了本地密钥 (SecretKey) 算法后,甲乙双方公开自己的公钥,使用对方的公钥和刚才产生的私钥加密数据,同时可以使用对方的公钥和自己的私钥对数据解密。不单单是甲乙双方两方,可以扩展为多方共享数据通讯,这样就完成了网络交互数据的安全通讯。

具体例子可以移步到这篇文章: 非对称密码之DH密钥交换算法

参考:
https://blog.csdn.net/u014294681/article/details/86705999

https://www.cnblogs.com/wangzxblog/p/13667634.html

https://www.cnblogs.com/taoxw/p/15837729.html

https://www.cnblogs.com/fangfan/p/4086662.html

https://www.cnblogs.com/utank/p/7877761.html

https://blog.csdn.net/m0_59133441/article/details/122686815

https://www.cnblogs.com/muliu/p/10875633.html

https://www.cnblogs.com/wf-zhang/p/14923279.html

https://www.jianshu.com/p/7a927db713e4

https://blog.csdn.net/ljx1400052550/article/details/79587133

https://blog.csdn.net/yuanjian0814/article/details/109815473

4. 比特币算法原理

比特币算法主要有两种,分别是椭圆曲线数字签名算法和SHA256哈希算法。

椭圆曲线数字签名算法主要运用在比特币公钥和私钥的生成过程中,该算法是构成比特币系统的基石。SHA-256哈希算法主要是运用在比特币的工作量证明机制中。

比特币产生的原理是经过复杂的运算法产生的特解,挖矿就是寻找特解的过程。不过比特币的总数量只有2100万个,而且随着比特币不断被挖掘,越往后产生比特币的难度会增加,可能获得比特币的成本要比比特币本身的价格高。

比特币的区块由区块头及该区块所包含的交易列表组成,区块头的大小为80字节,由4字节的版本号、32字节的上一个区块的散列值、32字节的 Merkle Root Hash、4字节的时间戳(当前时间)、4字节的当前难度值、4字节的随机数组成。拥有80字节固定长度的区块头,就是用于比特币工作量证明的输入字符串。不停的变更区块头中的随机数即 nonce 的数值,并对每次变更后的的区块头做双重 SHA256运算,将结果值与当前网络的目标值做对比,如果小于目标值,则解题成功,工作量证明完成。

比特币的本质其实是一堆复杂算法所生成的一组方程组的特解(该解具有唯一性)。比特币是世界上第一种分布式的虚拟货币,其没有特定的发行中心,比特币的网络由所有用户构成,因为没有中心的存在能够保证了数据的安全性。

5. 高中生如何理解比特币加密算法

加密算法是数字货币的基石,比特币的公钥体系采用椭圆曲线算法来保证交易的安全性。这是因为要攻破椭圆曲线加密就要面对离散对数难题,目前为止还没有找到在多项式时间内解决的办法,在算法所用的空间足够大的情况下,被认为是安全的。本文不涉及高深的数学理论,希望高中生都能看懂。

密码学具有久远的历史,几乎人人都可以构造出加解密的方法,比如说简单地循环移位。古老或简单的方法需要保密加密算法和秘钥。但是从历史上长期的攻防斗争来看,基于加密方式的保密并不可靠,同时,长期以来,秘钥的传递也是一个很大的问题,往往面临秘钥泄漏或遭遇中间人攻击的风险。

上世纪70年代,密码学迎来了突破。Ralph C. Merkle在1974年首先提出非对称加密的思想,两年以后,Whitfield Diffie和Whitfield Diffie两位学者以单向函数和单向暗门函数为基础提出了具体的思路。随后,大量的研究和算法涌现,其中最为着名的就是RSA算法和一系列的椭圆曲线算法。

无论哪一种算法,都是站在前人的肩膀之上,主要以素数为研究对象的数论的发展,群论和有限域理论为基础。内容加密的秘钥不再需要传递,而是通过运算产生,这样,即使在不安全的网络中进行通信也是安全的。密文的破解依赖于秘钥的破解,但秘钥的破解面临难题,对于RSA算法,这个难题是大数因式分解,对于椭圆曲线算法,这个难题是类离散对数求解。两者在目前都没有多项式时间内的解决办法,也就是说,当位数增多时,难度差不多时指数级上升的。

那么加解密如何在公私钥体系中进行的呢?一句话,通过在一个有限域内的运算进行,这是因为加解密都必须是精确的。一个有限域就是一个具有有限个元素的集合。加密就是在把其中一个元素映射到另一个元素,而解密就是再做一次映射。而有限域的构成与素数的性质有关。

前段时间,黎曼猜想(与素数定理关系密切)被热炒的时候,有一位区块链项目的技术总监说椭圆曲线算法与素数无关,不受黎曼猜想证明的影响,就完全是瞎说了。可见区块链项目内鱼龙混杂,确实需要好好洗洗。

比特币及多数区块链项目采用的公钥体系都是椭圆曲线算法,而非RSA。而介绍椭圆曲线算法之前,了解一下离散对数问题对其安全性的理解很有帮助。

先来看一下 费马小定理

原根 定义:
设(a, p)=1 (a与p互素),满足

的最下正整数 l,叫作a模p的阶,模p阶为(最大值)p-1的整数a叫作模p的原根。

两个定理:

基于此,我们可以看到,{1, 2, 3, … p-1} 就是一个有限域,而且定义运算 gi (mod p), 落在这个有限域内,同时,当i取0~p-2的不同数时,运算结果不同。这和我们在高中学到的求幂基本上是一样的,只不过加了一层求模运算而已。

另一点需要说明的是,g的指数可以不限于0~p-2, 其实可以是所有自然数,但是由于

所以,所有的函数值都是在有限域内,而且是连续循环的。

离散对数定义:
设g为模p的原根,(a,p) = 1,

我们称 i 为a(对于模p的原根g)的指数,表示成:

这里ind 就是 index的前3个字母。
这个定义是不是和log的定义很像?其实这也就是我们高中学到的对数定义的扩展,只不过现在应用到一个有限域上。

但是,这与实数域上的对数计算不同,实数域是一个连续空间,其上的对数计算有公式和规律可循,但往往很难做到精确。我们的加密体系里需要精确,但是在一个有限域上的运算极为困难,当你知道幂值a和对数底g,求其离散对数值i非常困难。

当选择的素数P足够大时,求i在时间上和运算量上变得不可能。因此我们可以说i是不能被计算出来的,也就是说是安全的,不能被破解的。

比特币的椭圆曲线算法具体而言采用的是 secp256k1算法。网上关于椭圆曲线算法的介绍很多,这里不做详细阐述,大家只要知道其实它是一个三次曲线(不是一个椭圆函数),定义如下:

那么这里有参数a, b;取值不同,椭圆曲线也就不同,当然x, y 这里定义在实数域上,在密码体系里是行不通的,真正采用的时候,x, y要定义在一个有限域上,都是自然数,而且小于一个素数P。那么当这个椭圆曲线定义好后,它反应在坐标系中就是一些离散的点,一点也不像曲线。但是,在设定的有限域上,其各种运算是完备的。也就是说,能够通过加密运算找到对应的点,通过解密运算得到加密前的点。

同时,与前面讲到的离散对数问题一样,我们希望在这个椭圆曲线的离散点阵中找到一个有限的子群,其具有我们前面提到的遍历和循环性质。而我们的所有计算将使用这个子群。这样就建立好了我们需要的一个有限域。那么这里就需要子群的阶(一个素数n)和在子群中的基点G(一个坐标,它通过加法运算可以遍历n阶子群)。

根据上面的描述,我们知道椭圆曲线的定义包含一个五元祖(P, a, b, G, n, h);具体的定义和概念如下:

P: 一个大素数,用来定义椭圆曲线的有限域(群)
a, b: 椭圆曲线的参数,定义椭圆曲线函数
G: 循环子群中的基点,运算的基础
n: 循环子群的阶(另一个大素数,< P )
h:子群的相关因子,也即群的阶除以子群的阶的整数部分。

好了,是时候来看一下比特币的椭圆曲线算法是一个怎样的椭圆曲线了。简单地说,就是上述参数取以下值的椭圆曲线:

椭圆曲线定义了加法,其定义是两个点相连,交与图像的第三点的关于x轴的对称点为两个点的和。网上这部分内容已经有很多,这里不就其细节进行阐述。

但细心的同学可能有个疑问,离散对数问题的难题表现在求幂容易,但求其指数非常难,然而,椭圆曲线算法中,没有求幂,只有求乘积。这怎么体现的是离散对数问题呢?

其实,这是一个定义问题,最初椭圆曲线算法定义的时候把这种运算定义为求和,但是,你只要把这种运算定义为求积,整个体系也是没有问题的。而且如果定义为求积,你会发现所有的操作形式上和离散对数问题一致,在有限域的选择的原则上也是一致的。所以,本质上这还是一个离散对数问题。但又不完全是简单的离散对数问题,实际上比一般的离散对数问题要难,因为这里不是简单地求数的离散对数,而是在一个自定义的计算上求类似于离散对数的值。这也是为什么椭圆曲线算法采用比RSA所需要的(一般2048位)少得多的私钥位数(256位)就非常安全了。

6. 区块链的加密技术

数字加密技能是区块链技能使用和开展的关键。一旦加密办法被破解,区块链的数据安全性将受到挑战,区块链的可篡改性将不复存在。加密算法分为对称加密算法和非对称加密算法。区块链首要使用非对称加密算法。非对称加密算法中的公钥暗码体制依据其所依据的问题一般分为三类:大整数分化问题、离散对数问题和椭圆曲线问题。第一,引进区块链加密技能加密算法一般分为对称加密和非对称加密。非对称加密是指集成到区块链中以满意安全要求和所有权验证要求的加密技能。非对称加密通常在加密和解密进程中使用两个非对称暗码,称为公钥和私钥。非对称密钥对有两个特点:一是其间一个密钥(公钥或私钥)加密信息后,只能解密另一个对应的密钥。第二,公钥可以向别人揭露,而私钥是保密的,别人无法通过公钥计算出相应的私钥。非对称加密一般分为三种首要类型:大整数分化问题、离散对数问题和椭圆曲线问题。大整数分化的问题类是指用两个大素数的乘积作为加密数。由于素数的出现是没有规律的,所以只能通过不断的试算来寻找解决办法。离散对数问题类是指基于离散对数的困难性和强单向哈希函数的一种非对称分布式加密算法。椭圆曲线是指使用平面椭圆曲线来计算一组非对称的特殊值,比特币就采用了这种加密算法。非对称加密技能在区块链的使用场景首要包含信息加密、数字签名和登录认证。(1)在信息加密场景中,发送方(记为A)用接收方(记为B)的公钥对信息进行加密后发送给

B,B用自己的私钥对信息进行解密。比特币交易的加密就属于这种场景。(2)在数字签名场景中,发送方A用自己的私钥对信息进行加密并发送给B,B用A的公钥对信息进行解密,然后确保信息是由A发送的。(3)登录认证场景下,客户端用私钥加密登录信息并发送给服务器,服务器再用客户端的公钥解密认证登录信息。请注意上述三种加密计划之间的差异:信息加密是公钥加密和私钥解密,确保信息的安全性;数字签名是私钥加密,公钥解密,确保了数字签名的归属。认证私钥加密,公钥解密。以比特币体系为例,其非对称加密机制如图1所示:比特币体系一般通过调用操作体系底层的随机数生成器生成一个256位的随机数作为私钥。比特币的私钥总量大,遍历所有私钥空间获取比特币的私钥极其困难,所以暗码学是安全的。为便于辨认,256位二进制比特币私钥将通过SHA256哈希算法和Base58进行转化,构成50个字符长的私钥,便于用户辨认和书写。比特币的公钥是私钥通过Secp256k1椭圆曲线算法生成的65字节随机数。公钥可用于生成比特币交易中使用的地址。生成进程是公钥先通过SHA256和RIPEMD160哈希处理,生成20字节的摘要成果(即Hash160的成果),再通过SHA256哈希算法和Base58转化,构成33个字符的比特币地址。公钥生成进程是不可逆的,即私钥不能从公钥推导出来。比特币的公钥和私钥通常存储在比特币钱包文件中,其间私钥最为重要。丢掉私钥意味着丢掉相应地址的所有比特币财物。在现有的比特币和区块链体系中,现已依据实践使用需求衍生出多私钥加密技能,以满意多重签名等愈加灵敏杂乱的场景。

7. 什么是比特币加密技术

比特币和区块链的诞生需要依赖于很多核心技术的突破:一是拜占庭容错技术;二是非对称加密技术;三是点对点支付技术。下面会依次介绍。
拜占庭容错技术
比特币和区块链诞生的首要难点在于如何创建分布式共识机制,也就是菜斯利·兰伯特等人1982年提出的拜占庭将军问题。所谓拜占庭将军问题是指,把战争中互不信任的各城邦军队如何达成共识并决定是否出兵的决策过程。延伸至计算机领域,试图创建具有容错性的分布式系统,即使部分节点失效仍可确保系统正常运行,也可让多个基于零信任基础的节点达成共识,并确保信息传递的一致性。
中本聪所提到的“拜占庭将军问题”解决方法起始于亚当﹒拜克在1997年发明的哈希现金算法机制,起初该设计是用于限制垃圾邮件发送与拒绝服务攻击。2004年,密码朋克运动早期和重要成员哈尔·芬尼将亚当﹒拜克的哈希现金算法改进为可复用的工作量证明机制。他们的研究又是基于达利亚·马凯与迈克尔·瑞特的学术成果:拜占庭容错机制。正是哈尔·芬尼的可复用的工作量证明机制后来成为比特币的核心要素之一。哈尔·芬尼是中本聪的最早支持者,同时也是第一笔比特币转账的接受者,在比特币发展的早期与中本聪有大量互动与交流。
非对称加密技术
比特币的非对称加密技术来源于以下几项密码学的技术创新:1976年,Sun公司前首席安全官Whitfield Diffie与斯坦福大学教授Martin Hell,在开创性论文《密码学的新方向》首次提出公开钥匙密码学的概念,发明了非对称加密算法。1978年省理工学院的伦纳德·阿德曼、罗纳德·李维斯特、阿迪·萨莫尔三名研究人员,共同发明了公开钥匙系统“RSA”可用于数据加密和签名,率先开发第一个具备商业实用性的非对称RSA加密算法。1985年,Neal Koblitz和Victor Miller俩人,首次提出将椭圆曲线算法(ECC),应用于密码学,并建立公钥加密的算法,公钥密码算法的原理是利用信息的不对称性,公钥对应的是私钥,私钥是解开所有信息的钥匙,公钥可以由私钥反推算出。ECC能够提供比RSA更高级别的安全。比特币使用的就是椭圆曲线算法公钥用于接收比特币,而私钥则是比特币支付时的交易签名。这些加密算法奠定了当前非对称加密理论的基础,被广泛应用于网络通信领域。但是,当时这些加密技术发明均在NSA严密监视的视野之内。NSA最初认为它们对国家安全构成威胁,并将其视为军用技术。直到20世纪90年代末,NSA才放弃对这些非对称加密技术的控制,RSA算法、ECC算法等非对称加密技术最终得以走进公众领域。
不过,中本聪并不信任NSA公布的加密技术,在比特币系统中没有使用RSA公钥系统,原因除了ECC能够提供比RSA更高级别的安全性能外,还担心美国安全部门在RSA留有技术后门。2013年9月,斯诺登就曾爆料NSA采用秘密方法控制加密国际标准,比特币采用的RSA可能留有后门,NSA能以不为人知的方法弱化这条曲线。所幸的是,中本聪神一般走位避开了RSA的陷阱,使用的加密技术不是NSA的标准,而是另一条鲜为人知的椭圆曲线,这条曲线并不在美国RSA的掌握之下。全世界只有极少数程序躲过了这一漏洞,比特币便是其中之一。

8. 比特币基础教学之:怎样保护你的私钥

私钥安全问题的重要性对比特币玩家来说不言而喻。对于比特币的重量级玩家或者比特币商家而言,如何保护好私钥更是需要仔细考虑和反复斟酌的。今天编者就和大家探讨一下如何保护比特币私钥的问题。对于bitcoin-qt客户端来说,比特币私钥一般储存在客户端的wallet.dat文件中。对于Blockchain这样的在线钱包用户来说,比特币私钥是储存在在线钱包的网络服务器上,用户也可以将私钥下载到本地。对于纸钱包的用户来说,私钥可以被打印出来。但是,怎样保护私钥的安全性呢?编者列出了几种方法供大家参考。
用对称加密的方法保管私钥 对称加密(Symmetric-key algorithm)是指加密和解密都用一个密钥。我们平时用到的加密方法一般都是对称加密,比如 winrar 中的加密,bitcoin-qt中对私钥文件的加密也是用的对称型加密算法。常用的对称加密算法有:AES、DES、RC4、RC5等等。对称加密需要用户设置相对比较复杂的密钥,以防止被暴力破解。Go to top方法一,用bitcoin-qt对私钥钱包进行加密。我们在命令模式下可以用encryptwallet命令来对钱包进行加密。命令模式的使用方法可以参见比特币基础教学之:怎样使用纸钱包私钥。这是私钥加密的最简易有效的方法。但是在使用walletpassphrase命令进行解密钱包时,密钥会被读入计算机内存中,所以存在攻击者获取密钥的可能性。加密命令: encryptwallet YOURPASSWORD解密钱包命令: walletpassphrase YOURPASSWORDTIMEOUT更改密码命令: walletpassphrasechange OLDPASSWORDNEWPASSWORDGo to top方法二,使用blockchain提供的AES加密。Blockchain为用户提供基于AES算法的私钥文件加密服务。用户可以将加密好的文件下载下来,并妥善保存。
Go to top方法三,用第三方软件Truecrypt对密钥文件加密,这也是编者比较推荐的方法。Truecrypt开源免费,软件成熟度很高,而且支持双因素认证和整个硬盘加密。另外,FBI人员在Truecrypt上面吃过亏,因此口碑很不错。Truecrypt的口碑FBI hackers fail to crack TrueCrypt The FBI has admitted defeat in attempts to break the open source encryption used to secure hard drives seized by Brazilian police ring a 2008 investigation.
The Bureau had been called in by the Brazilian authorities after the country’s own National Institute of Criminology (INC) had been unable to crack the passphrases used to secure the drives by suspect banker, Daniel Dantas.Brazilian reports state that two programs were used to encrypt the drives, one of which was the popular and widely-used free open source program TrueCrypt. Experts in both countries apparently spent months trying to discover the passphrases using a dictionary attack, a technique that involves trying out large numbers of possible character combinations until the correct sequence is found.
完整文章点击这里Truecrypt只支持对称加密算法。使用它的用户必须要将密钥牢记,如果你忘记密钥,那么没有人能够恢复你加密的文件。
Truecrypt官方网站Truecrypt使用文档 用非对称加密的方法保管私钥 非对称加密方法所采用公钥和私钥的形式来对文件进行加密。用户可以用公钥来对文件进行加密,用私钥对文件解密。常见的非对称加密算法有RSA、Elgamal、ECC等等。非对称加密的好处是密钥的复杂度一般很高,可以很有效的防止被暴力破解。缺点是有一定的使用门槛,不太适合普通级用户。Go to top 方法一、个人用户可以考虑使用RSA来进行加密。首先,可以创建公钥和私钥,点击这里生成密钥。将公钥私钥妥善保管后,便可以用公钥加密和私钥解密了,点击这里进行加密和解密。RSA公钥和私钥的产生过程RSA公钥和私钥的产生过程随意选择两个大的素数p和q,p不等于q,计算N=pq。根据欧拉函数,求得r= φ(N) = φ(p)φ(q) = (p-1)(q-1)选择一个小于r的整数e,求得e关于模r的模反元素,命名为d。(模反元素存在,当且仅当e与r互质)将p和q的记录销毁。(N,e)是公钥,(N,d)是私钥。Go to top方法二、比较成熟的非对称加密软件有我们可以采用PGP(Pretty Good Privacy)工具来对文件进行加密。PGP加密可以让每个公钥邦定到一个用户的所有信息。相比RSA来讲,PGP的功能更加完善可靠。但是随着PGP的升级,新的加密消息有可能不被旧的PGP系统解密,所以用户在使用PGP之前应该首先熟悉PGP的设置。PGP加密工具网上有很多,编者就不列举了。
wiki中关于PGP的介绍PGP在线加解密系统PGP命令FAQ 高级方法保管私钥 上述保管私钥的方式都很常见,有经验的攻击者依然可能得到用户的私钥文件。关于更加高级隐秘的私钥保管方式,参见以后的比特币高级教学内容。

9. 比特币是数字货币还是区块链

数字货币。比特币的系统是基于P2P通讯网络、非对称加密算法、分布式数据库以及以巨大算力作为运转成本的工作量证明共识机制,能够在全球范围内机进行安全可靠的、点对点的、极低成本的即时传输,使其具备了支付工具属性。

10. 比特币源码研读一:椭圆曲线在比特币密码中的加密原理

参加比特币源码研读班后首次写作,看到前辈black写的有关密钥,地址写的很好了,就选了他没有写的椭圆曲线,斗胆写这一篇。

在密码学上有两种加密方式,分别是对称密钥加密和非对称密钥加密。

对称加密:加密和解密使用的同样的密钥。

非对称加密:加密和解密是使用的不同的密钥。

二战中图灵破解德军的恩尼格码应该就是用的对称加密,因为他的加密和解密是同一个密钥。比特币的加密是非对称加密,而且用的是破解难度较大的椭圆曲线加密,简称ECC。

非对称加密的通用原理就是用一个难以解决的数学难题做到加密效果,比如RSA加密算法。RSA加密算法是用求解一个极大整数的因数的难题做到加密效果的。就是说两个极大数相乘,得到乘积很容易,但是反过来算数一个极大整数是由哪两个数乘积算出来的就非常困难。

下面简要介绍一下椭圆曲线加密算法ECC。

首先椭圆曲线的通式是这个样子的:

一般简化为这个样子:

()发公式必须吐槽一下,太麻烦了。)

其中

这样做就排除了带有奇点的椭圆曲线,可以理解为所有的点都有一条切线。

图像有几种,下面列举几个:[1]

椭圆曲线其实跟椭圆关系不大,也不像圆锥曲线那样,是有圆锥的物理模型为基础的。在计算椭圆曲线的周长时,需要用到椭圆积分,而椭圆曲线的简化通式:

,周长公式在变换后有一项是这样的:,平方之后两者基本一样。

我们大体了解了椭圆曲线,就会有一个疑问,这个东西怎么加密的呢?也就是说椭圆曲线是基于怎样的数学难题呢?在此之前还得了解一些最少必要知识:椭圆曲线加法,离散型椭圆曲线。

椭圆曲线加法

数学家门从普通的代数运算中,抽象出了加群(也叫阿贝尔群或交换群),使得在加群中,实数的算法和椭圆曲线的算法得到统一。

数学中的“群”是一个由我们定义了一种二元运算的集合,二元运算我们称之为“加法”,并用符号“+”来表示。为了让一个集合G成为群,必须定义加法运算并使之具有以下四个特性:

1. 封闭性:如果a和b是集合G中的元素,那么(a + b)也是集合G中的元素。

2. 结合律:(a + b) + c = a + (b + c);

3. 存在单位元0,使得a + 0 = 0 + a =a;

4. 每个元素都有逆元,即:对于任意a,存在b,使得a + b = 0.

如果我们增加第5个条件:

5. 交换律: a + b = b + a

那么,称这个群为阿贝尔群。[1]

运算法则:任意取椭圆曲线上两点P、Q (若P、Q两点重合,则做P点的切线)做直线交于椭圆曲线的另一点R’,过R’做y轴的平行线交于R。我们规定P+Q=R。(如图)[2]

特别的,当P和Q重合时,P+Q=P+P=2P,对于共线的三点,P,Q,R’有P+Q+R’=0∞.

这里的0∞不是实数意义的0,而是指的无穷远点(这里的无穷远点就不细说了,你可以理解为这个点非常遥远,遥远到两条平行线都在这一点相交了。具体介绍可以看参考文献[2])。

注意这里的R与R’之间的区别,P+Q=R,R并没有与P,Q共线,是R’与P,Q共线,不要搞错了。

法则详解:

这里的+不是实数中普通的加法,而是从普通加法中抽象出来的加法,他具备普通加法的一些性质,但具体的运算法则显然与普通加法不同。

根据这个法则,可以知道椭圆曲线无穷远点O∞与椭圆曲线上一点P的连线交于P’,过P’作y轴的平行线交于P,所以有无穷远点 O∞+ P = P 。这样,无穷远点 O∞的作用与普通加法中零的作用相当(0+2=2),我们把无穷远点 O∞ 称为零元。同时我们把P’称为P的负元(简称,负P;记作,-P)。(参见下图)

离散型椭圆曲线

上面给出的很好看的椭圆曲线是在实数域上的连续曲线,这个是不能用来加密的,原因我没有细究,但一定是连续曲线上的运算太简单。真正用于加密的椭圆曲线是离散型的。要想有一个离散型的椭圆曲线,先得有一个有限域。

域:在抽象代数中,域(Field)之一种可进行加、减、乘、除运算的代数结构。它是从普通实数的运算中抽像出来的。这一点与阿贝尔群很类似。只不过多了乘法,和与乘法相关的分配率。

域有如下性质[3]:

1.在加法和乘法上封闭,即域里的两个数相加或相乘的结果也在这个域中。

2.加法和乘法符合结合律,交换率,分配率。

3.存在加法单位,也可以叫做零元。即存在元素0,对于有限域内所有的元素a,有a+0=a。

4.存在乘法单位,也可以叫做单位元。即存在元素1,对于有限域内所有的元素a,有1*a=a。

5.存在加法逆元,即对于有限域中所有的元素a,都存在a+(-a)=0.

6.存在乘法逆元,即对于有限域中所有的元素a,都存在a*=0.

在掌握了这些知识后,我们将椭圆曲线离散化。我们给出一个有限域Fp,这个域只有有限个元素。Fp中只有p(p为素数)个元素0,1,2 …… p-2,p-1;

Fp 的加法(a+b)法则是 a+b≡c (mod p);它的意思是同余,即(a+b)÷p的余数与c÷p的余数相同。

Fp 的乘法(a×b)法则是 a×b≡c (mod p);

Fp 的除法(a÷b)法则是 a/b≡c (mod p);即 a×b∧-1≡c (mod p);(也是一个0到p-1之间的整数,但满足b×b∧-1≡1 (mod p);

Fp 的单位元是1,零元是 0(这里的0就不是无穷远点了,而是真正的实数0)。

下面我们就试着把

这条曲线定义在Fp上:

选择两个满足下列条件的小于p(p为素数)的非负整数a、b,且a,b满足

则满足下列方程的所有点(x,y),再加上无穷远点O∞ ,构成一条椭圆曲线。

其中 x,y属于0到p-1间的整数,并将这条椭圆曲线记为Ep(a,b)。

图是我手画的,大家凑合看哈。不得不说,p取7时,别看只有10个点,但计算量还是很大的。

Fp上的椭圆曲线同样有加法,法则如下:

        1. 无穷远点 O∞是零元,有O∞+ O∞= O∞,O∞+P=P

        2. P(x,y)的负元是 (x,-y),有P+(-P)= O∞

3. P(x1,y1),Q(x2,y2)的和R(x3,y3) 有如下关系:

x3≡-x1-x2(mod p)

y3≡k(x1-x3)-y1(mod p)

其中若P=Q 则 k=(3+a)/2y1 若P≠Q,则k=(y2-y1)/(x2-x1)

通过这些法则,就可以进行离散型椭圆曲线的计算。

例:根据我画的图,(1,1)中的点P(2,4),求2P。

解:把点带入公式k=(3*x∧2+a)/2y1

有(3*2∧2+1)/2*4=6(mod 7).

(注意,有些小伙伴可能算出13/8,这是不对的,这里是模数算数,就像钟表一样,过了12点又回到1点,所以在模为7的世界里,13=6,8=1).

x=6*6-2-2=4(mod 7)

y=6*(2-4)-4=2 (mod 7)

所以2P的坐标为(2,4)

那椭圆曲线上有什么难题呢?在模数足够大的情况下,上面这个计算过程的逆运算就足够难。

给出如下等式:

K=kG (其中 K,G为Ep(a,b)上的点,k为小于n(n是点G的阶)的整数)不难发现,给定k和G,根据加法法则,计算K很容易;但给定K和G,求k就相对困难了。

这就是椭圆曲线加密算法采用的难题。我们把点G称为基点(base point),k称为私钥,K称为公钥。

现在我们描述一个利用椭圆曲线进行加密通信的过程[2]:

1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。

2、用户A选择一个私钥k,并生成公钥K=kG。

3、用户A将Ep(a,b)和点K,G传给用户B。

4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r(r<n)。

5、用户B计算点C1=M+rK;C2=rG。

6、用户B将C1、C2传给用户A。

7、用户A接到信息后,计算C1-kC2,结果就是点M。因为

C1-kC2=M+rK-k(rG)=M+rK-r(kG)=M

再对点M进行解码就可以得到明文。

整个过程如下图所示:

密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:

T=(p,a,b,G,n,h),p 、a 、b 用来确定一条椭圆曲线,G为基点,n为点G的阶,h 是椭圆曲线上所有点的个数m与n相除的整数部分

这几个参量取值的选择,直接影响了加密的安全性。参量值一般要求满足以下几个条件:

1、p 当然越大越安全,但越大,计算速度会变慢,200位左右可以满足一般安全要求;

2、p≠n×h;

3、pt≠1 (mod n),1≤t<20;

4、4a3+27b2≠0 (mod p);

5、n 为素数;

6、h≤4。

200位位的一个数字,那得多大?而且还是素数,所以这种方式是非常安全的。而且再一次交易中,区块被记录下来只有10分钟的时间,也就是说要想解决这个难题必须在10分钟以内。即便有技术能够在10分钟以内破解了现在这个难度的加密算法,比特币社区还可以予以反制,提高破解难度。所以比特币交易很安全,除非自己丢掉密钥,否则不存在被破解可能。

第一次写一个完全陌生的数学领域的知识,也许我有错误的地方,也许有没讲明白的地方,留言讨论吧。总之写完后对比特比系统的安全性表示很放心。

参考文献

[1] 椭圆曲线密码学简介

[2] 什么是椭圆曲线加密(ECC)

[3] 域(数学)维基网络

区块链研习社源码研读班 高若翔

阅读全文

与比特币用的非对称算法相关的资料

热点内容
加密u盘内容怎么拷贝 浏览:281
安卓手机为什么看不到iso文件 浏览:578
用图片做文件夹图标 浏览:693
java正则表达式语法 浏览:865
美图秀在线压缩图片 浏览:184
苹果自带控制app是什么 浏览:906
孩子学编程怎么样 浏览:589
网络编程经典书籍 浏览:612
曲靖创建网站java程序员 浏览:690
256位加密中是什么意思 浏览:97
php多维数组去重 浏览:308
做程序员这一行储备人才怎么看 浏览:460
参加密逃文 浏览:327
苹果编程语言ios 浏览:763
求解病态系统常用的算法 浏览:994
驾校用的app叫什么 浏览:219
数控编程线的缠绕方法 浏览:972
安卓线性布局怎么设计计算器布局 浏览:24
拓本pdf 浏览:79
2017法硕指南pdf 浏览:295