区块链三大基石技术之一-加密

非对称加密技术RSA的出现,将信息加密技术划分为两大阶段,也为区块链的诞生做好了加密学的准备。

核心内容

非对称加密技术RSA的出现,将信息加密技术划分为两大阶段,也为区块链的诞生做好了加密学的准备。

区块链利用了RSA的签名验签过程,控制加密货币的归属。

公钥PublicKey即为加密货币的收款地址,链上存储着公钥持有一定数量的加密货币(未花费状态)。

花费加密货币,实际的操作是用私钥给转账指令进行签名,并发送到区块链网络。

区块链网络使用公钥对签名的转账指令进行验签,验证通过则证明指令来源于私钥持有人,即公钥PublicKey的生成人(加密货币的持有人)。

通过验证后,区块链网络将生成下一个公钥NewPublicKey(包含在转账指令内)的未花费加密货币持有记录,价值转移完成。

正文

在日常生活中,私有是一项权利,保护这种权利的方式也是多种多样的。

譬如一个贵重物品,为了不被他人侵犯,确保私有,我们可以放进保险柜,自己藏好钥匙。

在计算机世界里,信息加密技术就是为保障信息私有而生。不管是保存在磁盘里的文件,还是发送给其他人的消息,我们都不希望被不相关的人看到。

对称加密

在计算机出现之前,很早就有信息加密的应用场景了。

譬如凯撒密码。

明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。

如:hello world,用字母表后的第3个字母替换:

640.webp

hello world 加密为 khoor zruog。

hello world是明文;khoor zruog即为密文。

这里,凯撒密码的密钥就是3。

加密方根据字母表后移3位进行加密;解密方逆向进行解密。

这代表了很长一段时间加密的主流思想:

加密方和解密方都使用**同一个密钥**,发送方使用密钥通过一定方法混淆明文,生成无法识别的密文发送给接收方;接收方使用密钥逆向解密,生成可以理解的明文。

这就是对称加密技术。

介绍一个广泛应用的计算机对称加密算法之一-AES,Advanced Encryption Standard,即高级加密标准。

以下是Python的简单示例,做个简单直观的了解。

第一步生成密钥:

from cryptography.fernet import Fernet
# 生成密钥
key=Fernet.generate_key()
# key:
# b'h5hb5fdGW-vzwUqhWfzAzKSGgGH4aQJif1GLRL_buBw='

第二步加密,得到密文:

cipher_suite = Fernet(key)
# 明文
plaintext=b'hello world'
# 加密
encrypted_message=cipher_suite.encrypt(plaintext)
# 加密结果
encrypted_message:
#b'gAAAAABmuwAOmw_lcRXZqUeDtFdp3EfDvLyizJ4htkLE34GVGOOt8PernPhH3bXNLxdRgZiVn8Lb_tRGgIWMT5Ma98ImFJliiA=='

最后解密,取出"hello world":

decrypted_message = cipher_suite.decrypt(encrypted_message)
# 解密结果decrypted_message:
# b'hello world'

对称加密有个较大的缺陷,就是通信双方需要先传递一次密钥,这就留下了安全隐患,因为密钥传输过程可能泄露。非对称加密技术能很好地解决这一问题。

非对称加密

1977年,非对称加密技术RSA,由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

非对称加密技术的特点是,密钥有一对:私钥和公钥。密钥对的生成方保留私钥,将公钥公开。任何人都可以获取公钥并使用其对数据加密。加密后的数据只有私钥持有人可以解密使用,所以对于持有公钥的一方来说,发送的消息是安全的,他人获取后无法解密得到明文信息。

非对称加密不仅用于加密和解密,传输加密密文;还有签名和验签的作用,而实际上,区块链也只跟签名和验签有关系。

用Python代码直观感受下签名和验签过程。

生成密钥对:

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes

# 生成 RSA 密钥对
private_key = rsa.generate_private_key(
    public_exponent=65537, 
    key_size=2048, 
    backend=default_backend()
)
# 公钥由私钥生成,这点很重要,用于验证身份
public_key = private_key.public_key()

用私钥对“little seashell moving on”进行签名操作:

# 原始消息
message = b"little seashell moving on"
# 签名
signature = private_key.sign(
    message,
    padding.PSS(
        mgf=padding.MGF1(hashes.SHA256()),
        salt_length=padding.PSS.MAX_LENGTH
    ),
    hashes.SHA256()
)
print("Signature:", signature)

用公钥验证签名:

# 验签
try:
    public_key.verify(
        signature,
        message,
        padding.PSS(
            mgf=padding.MGF1(hashes.SHA256()),
            salt_length=padding.PSS.MAX_LENGTH
        ),
        hashes.SHA256()
    )  
    print("Signature is valid.")
except Exception as e:    
    print("Signature is invalid:", str(e))

输出结果:

Signature is valid.

私钥持有人将明文消息、签名后的消息一起发给公钥持有人,验证通过则证明发送人身份为私钥持有人。

综上,简单概述下RSA的作用:

公钥用来加密,私钥用来解密,加密和解密配对使用,用来传输信息;
私钥用来签名,公钥用来验签,签名和验签配对使用,用来证明身份;

签名和验签如何用于区块链

<!--StartFragment-->

验签通过,证明发送方是私钥持有人,这用来识别唯一的身份。

所谓的区块链交易,实际代码逻辑如下:

  1. 钱包生成一对密钥对,私钥A持有,公钥B对外公开,作为接收加密货币的钱包地址;
  2. 其他加密货币持有人向公钥B支付一枚加密货币,链上信息为公钥B持有一枚未花费的加密货币,此为公开信息;
  3. 这枚加密货币需要花费的时候,私钥A持有人生成一条转账指令,如将持有的一枚加密货币支付给钱包C。用私钥A对这条指令签名后发送到区块链网络。
  4. 区块链网络接收到签名后的转账指令,用公钥B验证。通过即可证明指令发送方持有私钥A,是合法的加密货币持有人,执行转账;
  5. 一枚加密货币转移到公钥C,转账完成。
  6. 链上信息更新为公钥C持有一枚未花费的加密货币,等待公钥C对应的私钥持有人下一次的转账指令。

区块链钱包的基本功能

钱包就是管理密钥对的软件,可以查询链上资产,生成转账指令,签名并发送转账指令到区块链,等待区块链确认执行。

此为钱包的基本功能。

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

0 条评论

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