RSA大作业 实现了 1.加、减、乘、除、移位、幂取模的高精度算法 2.利用快速幂和牛顿迭代法加速取模运算 3.中国剩余定理 4.Miller Rabin检测

简介: RSA大作业 实现了 1.加、减、乘、除、移位、幂取模的高精度算法 2.利用快速幂和牛顿迭代法加速取模运算 3.中国剩余定理 4.Miller Rabin检测

程序使用说明


429c63315f8655190d2e76fa706dca2b.png

双击RSAToy.exe运行程序,界面主要分为两部分:


1.左侧为RSA密钥生成部分,可以选择RSA-768,RSA-1024或者RSA-2048作为标准,并点击Generate Key按钮生成密钥。生成完成后,密钥中的


p,q,n,e,d


都会显示在文本框中。


2.右侧为消息发送部分,用户可以在消息输入框输入要发送的消息(目前只支持ASCI编码),并点击Send Message按钮即可发送消息。RSA算法会对消息先进行加密、再进行解密,并将加密和解密的结果都显示在对应的文本框中。


(注:目前仅支持1080P分辨率,在较高分辨率如2k\3k\4k下界面可能会显示异常)


算法实现亮点


在本次大作业中,实现了如下基本算法:

  1. 加、减、乘、除、移位、幂取模的高精度算法
  2. 利用快速幂和牛顿迭代法加速取模运算
  3. 中国剩余定理
  4. Miller Rabin检测

在RSA密钥的生成过程中,大素数生成是时间瓶颈,因此在素数生成过程中,我使用了以下方法来进行优化或加速:


快速幂


在Miller Rabin算法中,需要多次进行幂取模运算

image.png

,其中

a,d,n

均为大整数,经过测试,这一步是Miller Rabin判据最耗时的步骤,因此,对这一步进行优化非常关键。对幂取模这一步运算做优化,最直观和简单的算法是快速幂算法。


在计算

image.png


时,如果

d

为偶数,那么可以计算


image.png


,如果

d

为奇数,那么可以计算


image.png

,根据维基百科,快速幂的伪代码为:


functionmodular_pow(base,exponent,modulus)isifmodulus=1thenreturn0Assert::(modulus-1)*(modulus-1)doesnotoverflowbaseresult:=1base:=basemodmoduluswhileexponent>0doif(exponentmod2==1)thenresult:=(result*base)modmodulusexponent:=exponent>>1base:=(base*base)modmodulusreturnresult


不难发现,朴素的幂取模算法的时间复杂度为

O(d)

,而使用了快速幂之后,时间复杂度为

image.png

.以

RSA768RSA−768

为例,

dd

在二进制下是

384384

位的整数,因此经过384次迭代即可得到结果,相比线性复杂度,节省了相当多的时间。


牛顿迭代法

使用快速幂算法之后,发现计算

image.png

的时间仍然很长,发现主要是计算

amodn


比较耗时,因为计算

amodn


需要使用高精度除法,当


a

远远大于

n


时,将会使用相当多次的减法,从而导致这一步非常耗时。


因此我使用了基于牛顿迭代法的求模算法,记

n


在二进制下有

m


位,该算法通过寻找


,使得

image.png


,这里

<<<<

是左移符号,这样


image.png

.并且

amodnamodn


image.png


的值非常接近(事实上它们在大多数情况下是相等的),从而大大减少了减法的次数。

问题的关键在于:如何寻找

image.png


,这里我使用的是牛顿迭代法,定义函数


image.png

,那么函数的零点即为


image.png


,从而可以使用牛顿迭代法求解。在实验中发现,通常经过10-20次迭代,就可以找到

image.png

同时,注意到,如果要计算多个


image.png

n

的模,牛顿迭代法只需要计算一次即可,这又大大减少了取模的时间。

这一步优化是整个算法中最为关键的一步,如果不使用该方法,在几分钟的时间内甚至跑不完一次完整的Miller Rabin检测。


多线程

因为寻找素数的过程是可并行的,所以我利用了c++的多线程库,使用多线程来寻找素数。


我使用了多个线程同时判断整数的素性,并设置一个标志位,一旦某个线程找到一个素数,它将会修改此标志位,其余线程检查到标志位被修改后将会立刻退出。我使用了C++中的mutex来保护标志位以避免冲突。


其它小优化

  1. 随机递增搜索。在寻找素数时,不必每次都随机生成一个数,然后判断它的素性。而是首先生成一个奇数
                                  n

,如果

nn

不是素数,就给

nn

2


,重复此过程。在RSA-768下,平均需要380次即可找到一个素数。


2.利用小素数优化。对一个未知素性的整数进行Miller Rabin检测之前,可以先尝试该整数能否整除小素数,以检测该整数的素性。因为Miller Rabin检测相对比较耗时,这样做可以尽可能减少Miller Rabin检测的次数。在实现中,我使用了


  1. 1000010000
    以内的所有素数,在RSA-768下,平均找到每个素数仅需47次Miller Rabin检测。


实验结果


实验环境


操作系统: Windows 10


CPU: Intel(R) Core(TM) i7-8565U CPU @ 1.80GHz 1.99GHz


编程语言:C++


编译器:Microsoft Visual C++ Compiler16.4.29806.167


集成开发环境:Qt Creator(Qt 5.9.9 MSVC2015 64bit)


实验结果


在上述实验环境中,分别在RSA-768,RSA-1024和RSA-2048三种标准下生成100次公钥和密钥,并计算平均耗时,结果如下表所示:


image.png

附:一开始我是用的是MinGW编译器,不论怎么优化,生成RSA-768平均需要2s。走投无路之下,改用MSVC编译器,没想到速度快了4倍,真是蛋疼啊。。。。。。


感想和收获


这次大作业个人感觉很有趣,像是回到了大一写代码的时候!其实如果按照老师课上讲的内容,不去自己找资料、想办法的话,实现出的RSA肯定是慢的离谱。我一开始就实现了非常基础的版本,慢到跑不出结果,后来请教了别人,才发现可以用牛顿迭代法、用小素数来减少Miller Rabin检测的素数。我的实现从一开始跑不出结果、到2s跑出结果、最后将结果稳定在0.4s左右,看着自己的程序在一点点变快,这个过程真的很让人有成就感!


完整代码:https://download.csdn.net/download/weixin_55771290/87395423

相关文章
|
26天前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于MSER和HOG特征提取的SVM交通标志检测和识别算法matlab仿真
### 算法简介 1. **算法运行效果图预览**:展示算法效果,完整程序运行后无水印。 2. **算法运行软件版本**:Matlab 2017b。 3. **部分核心程序**:完整版代码包含中文注释及操作步骤视频。 4. **算法理论概述**: - **MSER**:用于检测显著区域,提取图像中稳定区域,适用于光照变化下的交通标志检测。 - **HOG特征提取**:通过计算图像小区域的梯度直方图捕捉局部纹理信息,用于物体检测。 - **SVM**:寻找最大化间隔的超平面以分类样本。 整个算法流程图见下图。
|
1月前
|
算法 安全
分别使用OVP-UVP和OFP-UFP算法以及AFD检测算法实现反孤岛检测simulink建模与仿真
本课题通过Simulink建模与仿真,实现OVP-UVP、OFP-UFP算法及AFD检测算法的反孤岛检测。OVP-UVP基于电压幅值变化,OFP-UFP基于频率变化,而AFD则通过注入频率偏移信号来检测孤岛效应,确保电力系统安全稳定运行。系统使用MATLAB 2013b进行建模与仿真验证。
|
25天前
|
算法 安全 Go
RSA加密算法详解与Python和Go实现
RSA加密算法详解与Python和Go实现
56 1
|
4天前
|
存储 JSON 算法
TDengine 检测数据最佳压缩算法工具,助你一键找出最优压缩方案
在使用 TDengine 存储时序数据时,压缩数据以节省磁盘空间是至关重要的。TDengine 支持用户根据自身数据特性灵活指定压缩算法,从而实现更高效的存储。然而,如何选择最合适的压缩算法,才能最大限度地降低存储开销?为了解决这一问题,我们特别推出了一个实用工具,帮助用户快速判断并选择最适合其数据特征的压缩算法。
12 0
|
18天前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
22 0
|
18天前
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
44 0
|
2月前
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
71 12
|
3月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
2月前
|
资源调度 算法
基于迭代扩展卡尔曼滤波算法的倒立摆控制系统matlab仿真
本课题研究基于迭代扩展卡尔曼滤波算法的倒立摆控制系统,并对比UKF、EKF、迭代UKF和迭代EKF的控制效果。倒立摆作为典型的非线性系统,适用于评估不同滤波方法的性能。UKF采用无迹变换逼近非线性函数,避免了EKF中的截断误差;EKF则通过泰勒级数展开近似非线性函数;迭代EKF和迭代UKF通过多次迭代提高状态估计精度。系统使用MATLAB 2022a进行仿真和分析,结果显示UKF和迭代UKF在非线性强的系统中表现更佳,但计算复杂度较高;EKF和迭代EKF则更适合维数较高或计算受限的场景。
|
3月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
227 1