密码学学习笔记(二十二):RSA签名方案

在RSA中,计算公钥N的欧拉函数\phi (N)和私钥是关键步骤。

如何计算\phi (N)呢?

RSA算法中的N是两个质数 p 和 q 的乘积。所以两个质数必须要找到。一旦找到 p 和 q就可以使用公式\phi(N) = (p-1) (q-1)来计算\phi (N)

计算私钥d

私钥 d 是满足 e*d ≡ 1 mod  \phi (N) 的整数。换句话说,d 是 e 关于 ϕ(N) 的模逆元。这可以通过扩展欧几里得算法来计算。

如何单纯的使用数学的方法找到p和q呢?

p和q可以使用python代码找到。

from sympy import isprime, mod_inverse

# 给定值
N = 9999
e = 5

# 求 N 的素因数的函数
def find_prime_factors(N):
    for i in range(2, N):
        if N % i == 0 and isprime(i):
            p = i
            q = N // i
            if isprime(q):
                return p, q
    return None, None

# 找到 p和q
p, q = find_prime_factors(N)

# 计算 phi(N)
phi_N = (p - 1) * (q - 1)

# 计算 d
d = mod_inverse(e, phi_N)

p, q, phi_N, d

如果不想用代码呢?

可以使用比如试除法费马分解法轮换法等计算。

试除法

从最小的质数开始(比如2),检查它是否能整除N,如果不能,继续尝试下一个质数(比如3、5、7...)。一旦找到一个质数 p 可以整除N,那么 p 是N的一个因子。一个因子 q 可以通过 q=N/p 计算得到。接着验证q是不是质数,如果是的话,那么 p 和 q 就是要找的因子。

在RSA签名验证中,如何从给定的签名 σ 找回原始消息 M?

RSA签名验证的基本步骤是计算 M = \sigma ^{e} mod N,其中 M 是原始消息。这个过程基于RSA算法的数学原理,所以就算只有公钥也可以验证签名的有效性。所以如果得到\sigma的值就可以得出M。

中国剩余定理(CRT)是怎么加快签名过程的?

在不使用CRT的情况下,RSA签名是计算 \sigma = M^{d} mod Nσ=MdmodN,其中 M 是消息。使用CRT时,签名过程如下:

  1. 计算两个模数下的指数d_{p} = d\, mod \, (p-1)d_{q} = d \, mod \, (q-1)
  2. 分别在 p 和 q 下计算签名\sigma_{p} = M^{d_{p}} \, mod\, p\sigma_{q} = M^{d_{q}} \, mod\, q
  3. 使用CRT合并结果: 首先计算 q_{inv} = q^{-1}\, mod\, p

然后合并结果:\sigma = \sigma _{q} + q(q_{inv}(\sigma _{p}-\sigma _{q})\, mod\, p)\, mod \, N

这个过程有效地将在 N下的大数运算分解为在 p 和 q 下的更小更快的运算。因此,使用CRT可以显著加快RSA签名的速度。

你可能感兴趣的:(密码学与计算机安全,密码学,学习,笔记,python)