使用Python的 RSA 数字签名方案
RSA算法是一种非对称密码算法。非对称实际上意味着它适用于两个不同的密钥,即公钥和私钥。顾名思义,公钥是给每个人的,而私钥是保密的。
非对称密码学的一个例子:
- 客户端(例如浏览器)将其公钥发送到服务器并请求一些数据。
- 服务器使用客户端的公钥加密数据并发送加密数据。
- 客户端接收此数据并对其进行解密。
由于这是非对称的,即使第三方拥有浏览器的公钥,除了浏览器之外没有其他人可以解密数据。
数字签名用于验证以电子方式发送的消息的真实性。数字签名算法使用公钥系统。预定的发送者用他/她的私钥签署他/她的消息,预定的接收者用发送者的公钥验证它。数字签名可以提供消息认证、消息完整性和不可否认性服务。
算法
RSA 密钥生成:
- 选择两个大素数 p 和 q
- 计算 n=p*q
- 选择公钥 e 使其不是 (p-1)*(q-1) 的因子
- 选择私钥 d 使得以下等式为真 (d*e)mod(p-1)(q-1)=1 或 d 是 E 的逆模 (p-1)*(q-1)
RSA数字签名方案:在RSA中,d是私有的; e 和 n 是公开的。
- Alice 使用 S=M^d mod n 创建她的数字签名,其中 M 是消息
- Alice 向 Bob 发送消息 M 和签名 S
- Bob 计算 M1=S^e mod n
- 如果 M1=M 则 Bob 接受 Alice 发送的数据。
下面是实现。
Python3
# Function to find gcd
# of two numbers
def euclid(m, n):
if n == 0:
return m
else:
r = m % n
return euclid(n, r)
# Program to find
# Multiplicative inverse
def exteuclid(a, b):
r1 = a
r2 = b
s1 = int(1)
s2 = int(0)
t1 = int(0)
t2 = int(1)
while r2 > 0:
q = r1//r2
r = r1-q * r2
r1 = r2
r2 = r
s = s1-q * s2
s1 = s2
s2 = s
t = t1-q * t2
t1 = t2
t2 = t
if t1 < 0:
t1 = t1 % a
return (r1, t1)
# Enter two large prime
# numbers p and q
p = 823
q = 953
n = p * q
Pn = (p-1)*(q-1)
# Generate encryption key
# in range 1
输出:
decryption key is: 160009
As M = M1, Accept the message sent by Alice