crypto
区块链中使用到的密码学
哈希算法
将任意长度的消息压缩为固定长度的二进制串,其输出称为哈希值,也称为散列值。
哈希函数的性质包括
- 抗碰撞性,所谓碰撞是指两个不同的消息在同一个哈希函数作用下,具有相同的哈希值,哈希函数的扛碰撞性是指寻找两个能够产生碰撞的消息在计算上是不可行的。
- 原像不可逆,指的是知道输入值,很容易通过哈希计算出哈希值,但知道哈希值,没有办法计算出原来的输入值。
- 难题友好性,没有便捷的方法去产生一满足特殊要求的哈希值。
哈希函数的应用,在区块链中,可用于验证消息的完整性。
加密
- 对称加密,加密解密钥匙为同一把
- 非对称加密,钥匙分为私钥和公钥,私钥加密,公钥解密
区块链中所使用的公钥密码算法是椭圆曲线算法。椭圆曲线函数的特性为曲线上的两个不同的点相加所得到的点仍在原曲线上,即P + P + P + P .. = k*P = Q,其中P、Q为均曲线上的点。且有特性如下,已知k和点P,求Q容易,但已知点P,Q,求k超超难,运用在实际中,k对应为私钥,Q对应为公钥。
数字签名
数字签名可保证消息的真实性和不可否认性。数字签名为使用私钥对消息摘要进行签名生成数字签名,验证数字签名时使用消息摘要,公钥、数字签名带入算法即可验证。
其中,签名算法,例如ECDSA,又或者BLS.. (emm,虽然有说签名就是公钥密码“反过来”实现的.但签名的算法其实没看懂.), 然后BLS的优势是签名长度短,在当前应用中,使用BLS签名的主要是与VRF一起使用,如DFINITY项目~
数字证书
一般使用上是对方持有你的公钥,你用私钥加密,发送给对方,对方使用你的公钥进行解密,问题在于万一对方持有的你的公钥被替换了,对方无法确认公钥是否是属于你的,解决方式呢,就是存在一个证书中心,所有人都持有证书中心的公钥,证书中心使用自己的私钥,对你的公钥和一些相关信息进行一起加密,生成数字证书,你在发送信息的时候附带上数字证书一起发送。
数字证书使用的示例之一为,https协议,网页加密。
首先,客户端向服务器发出加密请求,服务器用自己的私钥加密网页以后,连同本身的数字证书,一起发送给客户端,客户端(浏览器)的证书管理器中,有受信任的根证书颁发机构列表,客户端会根据这张列表,查看解开数字证书的公钥是否在列表之内(证书中心是否可靠)。如果数字证书记载的网址,与你正在浏览的网址不一致,就说明这张证书可能被冒用,浏览器会发出警告,如果这张证书不是由受信任的机构颁发的,浏览器会发出另一种警告,如果数字证书是可靠的,客户端就可以使用证书中的服务器公钥,对信息进行加密,然后与服务器交换加密信息。
应用
消息传输安全体系。
当发送方A向B发送数据时,需要考虑的问题有
- 数据的安全性,即数据不被偷窥
- 数据的完整性,即数据不被篡改
- 数据的真实性,即数据确实来自发送方,传输过程中没有被替换
- 数据的不可否认性,即发送方不能抵赖发送了消息
上述算法对应安全体系中,关系如下
MAC 与数字签名的对比
MAC,消息认证码。由消息和密钥生成MAC值,可用于确认完整性和真实性。
其实看起来和数字签名是有点像的,区别在于,MAC使用对称加密,加密解密的密钥是一样的,数字签名使用非对称加密,所以MAC不能保证发送方可以否认发送过数据,而数字签名却可以保证他不能抵赖(私钥只有你自己知道)。
签名
数字签名、数字证书
数字签名目前的实现方法之一为公私钥对,A将其公钥拿给B,B给A发消息的时候使用A的公钥进行加密,A收到消息后使用A的私钥进行解密。
数字签名,A发送消息给B,把消息进行哈希算法生成摘要,使用私钥对消息进行加密,生成的称为数字签名,发送时发送消息和数字签名。B收到消息后,使用A的公钥解密数字签名,证明确实是A发出的消息,另对消息求哈希与数字签名解密出来的哈希对比,可验证消息完整性。
数字证书,引入第三方可信机构,大家认为其公钥都是可信的,可信机构使用私钥对A的公钥及相关信息进行加密,称为数字证书,B使用可信机构公钥进行解密得到A的公钥,可保证A公钥确实A的公钥。
通常而言,公钥进行加密,私钥进行数字签名。
数字签名的作用,
- 一方面是消息的加密解密,
- 一方面可保证消息的完整性且不被篡改。
区块链中的数字签名
区块链中所使用的公钥密码算法是椭圆曲线算法。
椭圆曲线的数学意义为,两个椭圆曲线上的点相加所得到的点依然在原椭圆曲线上,即k*P = Q,P为椭圆上的点,在已知k、P,求点Q比较容易,但是反过来,已知点PQ,求k却是相当困难的。这个问题成为椭圆曲线上点群的离散对数问题。椭圆曲线密码体制正是利用这个设计,实际应用中,k作为私钥,q作为公钥。
椭圆曲线算法具有两个明显的有点:
- 短的密钥长度,这意味着小的带宽和存储要求。
- 所有的用户可以选择同一基域上的不同椭圆曲线,可使所有的用户使用同样的操作完成域运算。
椭圆曲线签名与验证签名:
- 发送消息包含消息本身、公钥、和数字签名。数字签名为,对消息求哈希后使用私钥进行签名
- 验证过程为,将消息取哈希、公钥、数字签名带入算法进行计算,根据计算结果可判定验证是否通过
数字签名的作用,
- 保证用户的账户不能被冒名顶替
- 确保用户不能否认其所签名的交易
区块链中的密码学
- 哈希算法,对消息A取哈希得到固定长度串B,可理解为摘要。A计算得到B,B很难计算出得到A。哈希碰撞的问题为不同的串得到相同的哈希,取决于哈希桶的大小,故当前很多哈希算法桶取值蛮大,如128、256等(桶大小为2的128或256次方,哈希碰撞的可能性基本很小很小)
- merkle树,对数据块进行取哈希,两两拼凑,再取哈希,最后得到根哈希,整个结构形成树,称为merkle树,验证某数据块只需得到相应非叶子节点哈希进行计算即可,可进行轻量验证
- 公钥密码
多重签名
多重签名,某条消息是由多个公钥(m个)进行签名,签名验证时需要n个公钥进行解密,其中m>=n。可以是3/2, 5/3等。
例如,动用这笔资金需要多个私钥签名,通常这笔资金或数字资产会保存在一个多重签名的地址或帐号里(就比特币而言,多重签名地址通常以3
开头)。在实际的操作过程中,一个多重签名地址可以关联n个私钥,在需要转账等操作时,只要其中的m个私钥签名就可以把资金转移了,其中m要小于等于n,也就是说m/n小于1,可以是2/3, 3/5等等,是要在建立这个多重签名地址的时候确定好的。