前言:
由于近来区块链概念的大火,使我认真阅读完Andreas M Antonopoulos大神的《精通⽐特币第二版》一书,按照我的阅读理解,比特币技术没有什么颠覆性的技术革新,它更多的是前人技术的叠加,然后利用了人性贪婪这一特性而形成链式效应,最后成功。本文不对区块链,或者说比特币进行概况性的介绍,而是讲述区块链所必须使用的密码技术原理。由于水平有限,希望能够写明白。
第一章 什么是密码技术
我们举个例子,小强要发一份电子邮件给小红,电子邮件的内容是:“今天晚上6点,天河城吃饭,不见不散!”,但是网络中一个的黑客小白,也是小强的情敌,他利用网络抓包工具窃听小强与小红的网络链路,截取了邮件内容。如下图:
那么,小白提前知道了小强与小红的约会,他就可以做很多事,至于做什么事就不在本文讨论的范围了。小强如何防止让小白知道他的约会呢?有一个办法,把“今天晚上6点,天河城吃饭,不见不散!”这句话加密,让小白截取了也看不明白,然后与小红预先约定的密码,小红收到加密的信息后使用预先约定的密码解密,还原出“今天晚上6点,天河城吃饭,不见不散!”这个约会。如下图:
这是一个最简单的加解密模型,小强通过AES算法,以及他和小红约定的密码(密码是他们两个人的生日连接,如“1999111120000520”),这个密码在计算机术语就叫密钥,AES算法就是一种数学运算规则,我们把密钥和算法称为密码技术。
由于小白不知道他们之间的密钥“1999111120000520”,所以他拿到的是:
k0oj5cPNQQAoqkqKHC4d94kBEyczzYd8+IPpNfVDnDa3un1weqcz17mYsvOeIQ6aMxA5+ulF3xviiaJrEtfW6w==
这一串加密的文本,无法解密,所以不知道内容是什么,而小红拿到了这一串加密的文本后,通过密钥“1999111120000520”及AES算法解密,就可以还原出加密前的内容:
“今天晚上6点,天河城吃饭,不见不散!”
下面通过python语言,实现这一过程的代码,注意你的计算机要导入pyCryptodome模块,如果你对编程没有兴趣,以下内容可以跳过不看
# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import base64
def Addtext(Emailtext):
while len(Emailtext.encode('utf-8')) % 16 != 0:
Emailtext += '\0'
return str.encode(Emailtext)
key = '1999111120000520'
text = '今天晚上6点,天河城吃饭,不见不散!'
aes = AES.new(str.encode(key), AES.MODE_ECB)
encrypted_text = str(base64.encodebytes(aes.encrypt(Addtext(text))),encoding='utf8').replace('\n', '')
decrypted_text = str(aes.decrypt(base64.decodebytes(bytes(encrypted_text,encoding='utf8'))).rstrip(b'\0').decode("utf8"))
print('加密文本:', encrypted_text)
print('解密文本:', decrypted_text)
代码运行结果
加密文本: k0oj5cPNQQAoqkqKHC4d94kBEyczzYd8+IPpNfVDnDa3un1weqcz17mYsvOeIQ6aMxA5+ulF3xviiaJrEtfW6w==
解密文本: 今天晚上6点,天河城吃饭,不见不散!
Process finished with exit code 0