📜  使用Python的 RSA 数字签名方案

📅  最后修改于: 2022-05-13 01:55:00.741000             🧑  作者: Mango

使用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