密码学学习笔记(二十二):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 = iq = N // iif isprime(q):return p, qreturn 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.hqwc.cn/news/239145.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android studio Load error:undefined path variables

android stuido 报错 Load error:undefined path variables Gson is undefined 处理方法: 点击进行Sync Project with Gradle Files

指针综合运用第一期

1.int**p的含义:*p表示这是一个指针,int*表示它指向的类型是int型的指针 2.*在打印或赋值时表示解引用,(向右对应),如**p,为*p的解引用指向某个指针,再进行解引用得到确定的值 3.指…

如何解决“该公众号提供的服务出现故障,请稍后再试”

出现“该公众号提供的服务出现故障,请稍后再试” , 或者是出现 “公众号接口出现异常,请加入微信群接收接口报警” 的提问, 出现这个一般是开发者自身服务器出现问题导致的。 本文我来教大家如何排查。 第一步:加入告…

一个简单的参数帮助框架,c实现

文章目录 具体实现如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> void print_help(char *argv[]) { printf("Usage: %s [options]\n", argv[0]); printf("Options:\n"); printf(" -h, -…

Leetcode—704.二分查找【简单】

2023每日刷题&#xff08;四十七&#xff09; Leetcode—704.二分查找 实现代码 int lower_bound(int* arr, int numsSize, int tar) {int left 0, right numsSize;int mid left (right - left) / 2;while(left < right) {mid left (right - left) / 2;if(arr[mid] …

Mysql的页结构详解

1.数据库的存储结构&#xff1a;页 索引结构为我们提供了搞笑的查找方式&#xff0c;索引信息和数据记录都在保存在文件上的&#xff0c;准确地说&#xff0c;是保存在“页”结构中。 1.1磁盘与内存的基本交互单位&#xff1a;页 InnoDB将数据划分为若干个页&#xff0c;Inn…

vmware 安装 AlmaLinux OS 8.6

选择系统镜像 选择镜像 选择安装位置和修改名称 可以自定义硬件&#xff0c;也可以不选择&#xff0c;后面可以再设置 自定义硬件可以设置内存和cpu等信息 安装虚拟机系统 密码如果简单的话需要点击两次done 才能保存

每日一题:NowCower-JZ64.求1+2+3+...+n

每日一题系列&#xff08;day 10&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

用Flask构建Python的API接口

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版&#xff0c;欢迎购买。点击进入详情 文章目录 Flask简介编码运行 Flask简介 如果你的代码是用python实现的&#xff0c;但是你想写一个类似SpringBoot那种的API接口&#xff0c;这时我们可以使用Flas…

【LeeCode】24. 两两交换链表中的节点

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4] 输出&#xff1a;[2,1,4…

6.C转python

1.用append函数增加数组元素时,注意好那个 . 2.可以用insert()函数增加列表任意位置的元素,参数一为插入的下标,而二为内容 例: 若那个参数一超过了列表的最大下标,则会在列表末尾添加内容 3.查找列表中的元素 例: 4.可以使用index函数来找到当期那要找的元素的下标 例(…

状态类算法复杂排序输出

对于目标检测任务中对某一类的检测结果进行输出的时候&#xff0c;一般都是无序的&#xff0c;很明显这样子很难满足的我们的需求&#xff0c;我们更喜欢他是这样子输出的&#xff1a; &#x1f447; 我们可以看到——”按顺序输出结果“中的字段是完美的和上面图片中的识别结…