非对称加密技术RSA的出现,将信息加密技术划分为两大阶段,也为区块链的诞生做好了加密学的准备。
非对称加密技术RSA的出现,将信息加密技术划分为两大阶段,也为区块链的诞生做好了加密学的准备。
区块链利用了RSA的签名和验签过程,控制加密货币的归属。
公钥PublicKey即为加密货币的收款地址,链上存储着公钥持有一定数量的加密货币(未花费状态)。
花费加密货币,实际的操作是用私钥给转账指令进行签名,并发送到区块链网络。
区块链网络使用公钥对签名的转账指令进行验签,验证通过则证明指令来源于私钥持有人,即公钥PublicKey的生成人(加密货币的持有人)。
通过验证后,区块链网络将生成下一个公钥NewPublicKey(包含在转账指令内)的未花费加密货币持有记录,价值转移完成。
在日常生活中,私有是一项权利,保护这种权利的方式也是多种多样的。
譬如一个贵重物品,为了不被他人侵犯,确保私有,我们可以放进保险柜,自己藏好钥匙。
在计算机世界里,信息加密技术就是为保障信息私有而生。不管是保存在磁盘里的文件,还是发送给其他人的消息,我们都不希望被不相关的人看到。
在计算机出现之前,很早就有信息加密的应用场景了。
譬如凯撒密码。
明文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后被替换成密文。
如:hello world,用字母表后的第3个字母替换:
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-->
验签通过,证明发送方是私钥持有人,这用来识别唯一的身份。
所谓的区块链交易,实际代码逻辑如下:
钱包就是管理密钥对的软件,可以查询链上资产,生成转账指令,签名并发送转账指令到区块链,等待区块链确认执行。
此为钱包的基本功能。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!