参考
https://www.jianshu.com/p/ce3893a7be09
比特币的加密算法
https://www.jianshu.com/p/57fc42456ab4
分类和简述
常见的密钥加密算法类型大体可以分为三类:对称加密(单秘钥加密)、非对称加密、单向加密(结果唯一且计算过程可重复但是计算不可逆)
对称加密算法
对称加密算法采用单密钥加密,在通信过程中,数据发送方将原始数据分割成固定大小的块,经过密钥和加密算法逐个加密后,发送给接收方;接收方收到加密后的报文后,结合密钥和解密算法解密组合后得出原始数据。由于加解密算法是公开的,因此在这过程中,密钥的安全传递就成为了至关重要的事了。而密钥通常来说是通过双方协商,以物理的方式传递给对方,或者利用第三方平台传递给对方,一旦这过程出现了密钥泄露,不怀好意的人就能结合相应的算法拦截解密出其加密传输的内容。
- 例子:比如字符串的位移运算 A 位移 N位,进行加密, 明文 "GDKKM" 位移1位 密文:HELLO
- 算法特点:对称加密算法拥有着算法公开、计算量小、加密速度和效率高得特定,但是也有着密钥单一、密钥管理困难等缺点。
非对称加密
非对称加密算法采用公钥和私钥两种不同的密码来进行加解密。公钥和私钥是成对存在,公钥是从私钥中提取产生公开给所有人的,如果使用公钥对数据进行加密,那么只有对应的私钥才能解密,反之亦然。
例子:
发送方Bob从接收方Alice获取其对应的公钥,并结合相应的非对称算法将明文加密后发送给Alice;Alice接收到加密的密文后,结合自己的私钥和非对称算法解密得到明文。这种简单的非对称加密算法的应用其安全性比对称加密算法来说要高,但是其不足之处在于无法确认公钥的来源合法性以及数据的完整性。
算法特点:非对称加密算法具有安全性高、算法强度负复杂的优点,其缺点为加解密耗时长、速度慢,只适合对少量数据进行加密,其常见算法包括RSA、ECC
RSA 算法:
RAS 算法的安全性依赖于大数分解。大数分解是一个数学上公认的难题,比如说对于数字4, 000, 000, 000, 000, 000, 000, 000, 000, 000, 001=1, 199, 481, 995, 446, 957x3, 334, 772, 856, 269, 093,要找到2个素数来计算得出前面的数字式非常难。对于一些大数的分解,即使借助于计算机的运算,依然要非常长的时间。比如:对于200位的非特殊数字RSA200,2005年计算机花了18个月时间才把它分解成两个素数。可以看出RSA 算法的强度是非常高的,比较难以破解。ECC算法:其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。
单向加密
单向加密算法常用于提取数据指纹,验证数据的完整性。发送者将明文通过单向加密算法加密生成定长的密文串,然后传递给接收方。接收方在收到加密的报文后进行解密,将解密获取到的明文使用相同的单向加密算法进行加密,得出加密后的密文串。随后将之与发送者发送过来的密文串进行对比,若发送前和发送后的密文串相一致,则说明传输过程中数据没有损坏;若不一致,说明传输过程中数据丢失了。单向加密算法只能用于对数据的加密,无法被解密,其特点为定长输出、雪崩效应。
实际的功能就是签名的过程,类似于MD5值对数据的相同性做保证,保证发送的明文没有被篡改过
发送者: 明文+单向加密后的签名,发送给接收者,接收者通过 明文+签名运算的出来的结果 和之前的签名做比对。比对成功,说明明文未被篡改,明文真实可靠,比对失败,则数据被改过。
常见的算法包括:MD5、sha1、sha224等等,其常见用途包括:数字摘要、数字签名等等。
实现原理:一般通过加密过程中,这种会丢掉一部分信息的加密方式被称为“单向加密”,来实现不可逆推算。
比如说:需要加密的数字 M,采用下面的加密规则进行加密。
- 将M 加上 123456;
- 把结果平方,取第 3 - 10 位,组成一个8位数字;
- 将这个数字除以456789 求余数;
得到的数字就是加密之后的结果。
比特币的加密算法
比特币中采用了:SHA256和交易签名和交易确认,也就是单向加密和ECC非对称加密。
SHA256不仅仅是实现签名,还实现了MerkleTree的压缩的功能
SHA-256算法(Secure Hash Algorithm)
单向加密算法,一般通过加密过程中,丢掉一部分信息的加密方式被称为“单向加密”,来实现不可逆但是可重复且唯一的推算。
主要作用不是加密,而是做签名防止篡改,以及数据压缩得到体积更小的信息摘要。
- 输入一个最大长度不超过2^64 bit 字节类型的参数,计算出一个256bit的数字,再换算一个32位的字节(8*32=256 一个字节8bit uint8)数组,最终包装成一个64位的16进制数字
- 值长度固定:返回值的长度是一定的,64位的16进制数字,和输入无关
- 值唯一且可重复:每次传入相同的参数,计算出来的值是唯一的
- 不可逆:无法通过结果值逆推参数值
通过传入一个最大长度不超过2^64 bit的参数,返回的字节的数组长度为32位byte数组,在golang当中,1byte =uint8,最大是255(2进制),最大是ff(16进制),也就是1个byte可以表示255种不同的字符,比如 0-9 a-z A-Z 符号们,而uint8的最大值用16进制表示的话,是ff,刚好2位,所以1个32位的byte数组,正好用64位的16进制数字表示。
var sha01 = sha256.Sum256([]byte("hello world"))
const Size = 32
func Sum256(data []byte) [Size]byte {
var d digest
d.Reset()
d.Write(data)
return d.checkSum()
}
比特币使用的加密算法被称之为椭圆曲线算法(ECC),是一种著名的非对称算法。相较于另一种著名的非对称算法RSA,ECC算法的数学理论非常深奥和复杂,在工程应用中比较难于实现,但它的单位安全强度相对较高。由于ECC 算法数学理论深奥,难以被一般民众掌握,为了便于说明,本文将对RSA 算法的原理进行说明,以使大家对比特币加密算法有个深入的了解。
有疑问加站长微信联系(非本文作者)