本文用20行Python代码演示加密、解密、签名、验证的功能。 画葫芦,不仅可以理解加密技术,还可以自己实现加密通信机制。
因为加密、解密基于更高级的数学理论,所以不建议自己实施加密算法。 只需直接调用相应的库。 二.加密技术
加密技术这里列出了对称加密和非对称加密两种。
在说明加密技术之前,我们必须假设我们的使用场景也是密码学中常见的设置。
爱丽丝鲍勃是通信双方
伊夫是窃听者
传递的消息是PlainText
用于加密的私钥key
加密的密文是secret message
三、普通锁:简单的对称加密
对称加密:加密和解密都使用相同的私钥。 例如,key=' 1234567887654321 '.encode (utf-8 ),该key是Alice和Bob的公用密钥。 当Alice发送消息时,他需要通过以下操作完成加密:
第一行引入了AES算法。 AES是对称加密的算法
第二行新加密装置,key是私钥,AES.MODE_ECB是信息填充模式
第三行完成加密
第4行的加密信息用b64encode编码后,发送给Bob。
HTTP是文本协议,内容都是文本字符。 要传输二进制文件,必须将其转换为文本。 Base64代码用字符指示二进制编码格式。
Bob在收到消息后,如下进行解密、解密操作。
得到的plainText是来自Alice的明文信息。
请注意,两人是用同一私钥加密、解密的。
首先,解决一个小问题吧。 互联网有时丢包很多,在谈论Alice时缺乏头脑。 我该怎么办?
四、不能篡改的指纹:散列函数
就像人有指纹一样,传达的信息中也有自己的指纹。 散列函数用于查找消息的指纹。 散列函数也称为消息摘要函数,请参见有名的含义。 摘要内容制作指纹。 这个输出(指纹)很有特点:
无论输入的长度如何,输出的长度都是恒定的,输出看起来像乱码。
输入略有变化,输出差异很大。
消息可以发出指纹,指纹不能发出消息。
通过上述特性,Alice可以散列消息,并将散列值和消息都给鲍勃。 鲍勃也将消息散列化,如果两个值相同,则表明这个词的内容完整,没有篡改或丢弃信息。结果690 A8 CDA 8894 e 37 a6 fff 4d 1790 d 53 b 33。 鲍勃也会对这条消息进行散列,如果结果相同,说明这条信息是完整的。
现在,让我们来解决另一个大问题。 对称加密丢失了私钥,被坏人夏娃拿走后,他可以完全窃听Alice和Bob之间的通信,还可以伪装成向对方发送消息。
非对称加密必须出现。
五.矛盾:不对称加密
不对称加密是指加密和解密的私钥不是一个而是一对。 把自己拥有的东西称为私钥,交给对方的东西称为公钥。 其特点如下。
公钥加密,私钥解密。
私钥加密,公钥解密。
私钥可以推导公钥,相反不行。
利用以上特点,可以实现安全的加密算法。 首先鲍勃生成私钥,并将其保存为文件。
其中
Bob_prikey是Bob的私钥,由自己保管。
Bob_pubkey是Bob的公钥,传递给Bob。
爱丽丝给鲍勃发信息的时候
使用Bob公钥加密: secret=RSA.encrypt(plain_byte,Bob_pubkey )。
鲍勃收到消息后
Bob使用自己的私钥对Alice发送的信息进行解密。 plain=RSA.decrypt(secret,Bob_prikey ).decode ) ' utf-8 '。
Bob的公钥可以由Alice向Bob发送消息,Bob用自己的私钥暴露。 同样,Alice的密钥对可以向对方发送消息。 至此,Alice和Bob实现了安全通信。 他们用对方的公钥加密,用自己的私钥解密发给自己的信息。
爱丽丝发给鲍勃的消息,即使被夏娃截获,也没有鲍勃的私钥,无法解开密文。
但是,如果伊夫用鲍勃的公钥加密信息,然后冒充Alice发送鲍勃,那该怎么办呢? 如何确保Alice是Alice而不是Eve? 问题的关键是,Alice拥有Alice的私钥,而Eve没有私钥,这是数字签名技术的基础。
六、真言:数字签名
伊夫假扮爱丽丝,就像一个假唐僧假扮唐僧,看起来言行和行为相似,怎么区分呢? 很简单。 真唐僧有核心技术。 那是极限的诅咒。
在非对称加密的情况下,通常用公开密钥加密,秘密密钥解密。 用私钥加密的话,实际上相当签名。 因为只有私钥的所有者才能加密,并由公钥解密。 因此,私钥加密对应于私钥持有者确认签名——。 此消息来自私钥持有人。秘钥相当于真唐僧紧逼的咒语。
为了高效,一般不加密原始信息,而是加密散列值。 根据上面的散列特性,这仍然可以确保原始信息没有被唯一地篡改。
用私钥加密消息摘要称为数字签名。
验证步骤如下:
爱丽丝打算发送消息PlainText
首先计算其MD5散列值Hash_a
对散列值进行私钥加密(数字签名)
把爱丽丝的公钥、数字签名和消息发给鲍勃
鲍勃收到信息后
使用Alice的公钥解密数字签名,生成要验证的哈希值Hash_a
然后计算消息哈希值Hash_b
如果Hasha==Hashb,则表示发送者必须是具有私钥的Alice,并且消息没有更改
否则,信息表明不是Alice发送的
复制
signature=RSA.sign(plain_byte,Alice_prikey,' MD5 ' ) )。
status=RSA.verify(plain_byte,signature,Alice_pubkey ) )。
1.
2.
请注意,上面示例中的sign方法将签名Alice私钥,而使用Alice公钥进行检查。 Alice无法否认他签署的信息。 只有他有自己的私钥,别人不能在这样的信息上签名。
正如真唐僧坚定地念咒一样,这是他的秘密钥匙。 假唐僧看起来很体面,但他没有掌握紧箍咒,所以读不懂真言。
七.总结
本文展示了如何使用20行Python代码来实现安全的通信功能。
散列函数是一种可以提取消息数字指纹的工具,可以验证数据的完整性。
对称加密简单实用。
通过不对称加密,我们实现了安全的通信。 数字签名使对方无法伪装或否认。