1. 概述
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是在使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用。
2. 举例
假设现在有两个人要在互联网上传输信息,Alice、Bob
Alice 发送给 Bob
完整过程:
Alice:
1、A把信息原文进行哈希运算,得到信息的数字摘要
2、A用自己私钥,采用非对称加密算法,对数字摘要进行加密,得到数字签名
3、A用对称算法的密钥,采用对称算法,对信息原文和数字签名和A的公钥一起加密,得到加密信息
4、A用B的公钥,采用非对称算法,把对称密钥加密,形成信封。就像是对称密钥装到了B公钥加密的信封里面
5、A把加密信息和数字信封一起发给B
Bob:
1、B收到数字信息,用自己的私钥解密信封,拿到对称密钥
2、B用对称密钥,把加密信息解密,得到信息原文和数字签名和A的公钥
3、B用A的公钥解密数字签名,得到数字摘要1
4、B将原文用同样的哈希算法,得到数字摘要2
5、将摘要1和摘要2对比。如果相等,则原文没有被修改,签名是真实的
3.Python实现
这里我们用到2个算法:RSA、DES DES密钥为:taiyang
RSA是我纯手撕的,DES是我从网上cv后改了一点
由于水平有限不能实现完整过程
但是大概过程还是能实现的
本文实现的过程:
Alice:
1、对明文进行对称加密,使用DES
2、Alice用自己的私钥对使用DES加密后的加密信息进行RSA加密,得到数字签名
3、Alice用Bob的公钥对第 2 步得到的数字签名进行RSA加密,获得最终的密文
Bob:
1、用自己的私钥对密文进行解密得到数字签名
2、用Alice的公钥对数字签名进行解密,得到信息摘要
3、使用DES解密信息摘要获得明文
核心代码
import RSA as rsa
from DES import DES
des = DES()
def Alice(message):
# 第 1 步
encryptedInformation = des.normalEncode(message)
# 第 2 步
'''''''''''''''''''傻逼代码'''''''''''''''''''''''''
temp = encryptedInformation[:6]
global dictionary
dictionary = {temp: encryptedInformation}
'''''''''''''''''''能跑就行'''''''''''''''''''''''''
summaryBefore = int(temp, 16) # 信息摘要
digitalSignature = rsa.rsaEncode(summaryBefore, Alice_D, Alice_N) # 数字签名
# 第 3 步
cipherText = rsa.rsaEncode(digitalSignature, Bob_E, Bob_N)
return cipherText, digitalSignature
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
def Bob(cipherText):
# 第 1 步
digitalSignature = rsa.rsaDecode(cipherText, Bob_D, Bob_N)
# 第 2 步
summaryAfter = rsa.rsaDecode(digitalSignature, Alice_E, Alice_N)
# 第 3 步
encryptedInformation = dictionary[str(hex(summaryAfter))]
# 第 4 步
plainText = des.normalDecode(encryptedInformation)
return digitalSignature, plainText
项目完整代码:戳我🌹
运行截图
- 密钥输入正确

- 密钥输入错误

本文完
敬爱与明天🌹