当前位置: 首页 > article >正文

密码学学习笔记(二十二):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签名的速度。


http://www.kler.cn/a/154590.html

相关文章:

  • Neo4j Desktop 和 Neo4j Community Edition 区别
  • 【模板】字典树luoguP8306
  • L11.【LeetCode笔记】有效的括号
  • LLMs之Code:Qwen2.5-Coder的简介、安装和使用方法、案例应用之详细攻略
  • 探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力
  • ZooKeeper单机、集群模式搭建教程
  • CC2530basic_Rf串口无线收发
  • [蓝桥杯 2020 省 AB1] 解码
  • 已解决AttributeError: module ‘gradio‘ has no attribute ‘outputs‘
  • Java集合类的重要性
  • 误用STM32串口发送标志位 “USART_FLAG_TXE” “USART_FLAG_TC”造成的BUG
  • GPT实战系列-大模型训练和预测,如何加速、降低显存
  • 【涨薪技术】深入接口测试之Mock技术
  • 关于STM32G0 FLASH 写入时出现PGSERR的一种处理办法
  • n个整数存放在一个一维数组A中,任选一种程序设计语言,编写一个函数,利用递归的方法,求数组中各整数的平均值
  • 状态模式-C++实现
  • 使用java批量生成Xshell session(*.xsh)文件
  • Unity对接后台和加载图片
  • 4.4-Docker bridge0详解
  • oracle FUNCTION(任意两个时间 之间的工作小时)
  • 游戏被流量攻击会有什么样的影响,该用什么样的防护方式去处理
  • 07-原型模式-C语言实现
  • 2022年9月6日 Go生态洞察:Go的漏洞管理新支持
  • 基于Cocos2D-X框架闯关游戏的设计
  • acwing算法基础之贪心--排序不等式、绝对值不等式和推公式
  • 【LeetCode热题100】【双指针】移动零