C++RSA算法文件加密解决方案RSA论文 第7页
2.2.3 引用DLL的.Net类与实现文件操作功能的窗体应用程序
在C#编写的.Net类里,使用特性[DllImport("sanpack_rsa.dll")]引用C接口的DLL组件。类中接口DLL的函数都以静态成员的方式对外公开,其他.Net程序可以直接使用。在类库中还提供了任意长度随机串的生成函数,此函数用于生成寻找素数的大数起点。
文件操作使用.Net基础类库中的System.IO中的类实现。一般因为文件操作十分简单,用流输入输出的方式包装完成,程序中将文件操作直接放在菜单项关联的事件处理函数中。
窗体等图形操作界面直接由Visual Studio的所见即所得的方式完成,不需要编码实现。
最终实现的应用程序,结构如图2-8所示。
图2-8 本软件的Visual Studio解决方案
第3章 软件整体测试与分析改进
3.1 编写测试各项性能需要的精确计时类
由于.Net基础类库提供的计时功能十分不精确,无法胜任软件性能测试的工作,这里使用Windows API 函数QueryPerformanceCounter和QueryPerformanceFrequency进行精确计时。功能被封装在C#类HighResolutionTimer中,使用时只需构造一个此类的对象,在计时开始的时候调用其Start方法,计时结束时调用其Stop方法,然后访问其ElapsedTime属性,就可以得到一个以秒为单位的float型精确的计时值了。API 函数QueryPerformanceCounter和QueryPerformanceFrequency是靠查询CPU的高精度计时器来计时的,所以可以轻松的精确到毫秒级计时。
附录中给出了这个类的源代码。
3.2 测试数据与分析改进
3.2.1 密钥生成测试
生成密钥运算最费时的工作是寻找素数。如2.2.1.3小节所叙述,寻找素数是一项颇为复杂的工作,其速度可能受以下变量的影响:RSA加密需要的n的位数(寻找素数的整数起点大小start)、大素数测试时底数A的个数(针对一个整数的素数测试次数)、小素数因子p的个数NP、一轮寻找遍历的整数个数SS等。其中最具影响力的因素显然是RSA加密需要的n的位数。以下对各变量分别进行测试,暂且忽略操作系统调度对测试的影响。
1. 测试加密使用的n的位数对耗时的影响
即 在固定A、NP、SS等变量的情况下,改变加密位数n,测试密钥生成的时间消耗情况。测试时,A取4个值,分别为2、3、5、7,NP取200,SS取1000。测试PC配置为CPU CR1.7GHZ/外频100MHZ/物理内存512MDDR/MSI6398主板845 Ultra-AD芯片组,下文测试中,未说明PC配置的也都在同一PC完成,不再重复。统计数据如表3-1所示。表中各项对应的全部测试数据见 ,包括两个作为素数搜索起点的随机数和生成的素数p、q以及e、d、n。
表3-1 RSA加密模数n与密钥生成耗时的关系
加密位数n (bit) 对应的搜索起点字节数 测试5次获得随机密钥消耗的时间(秒) 平均时间消耗(秒)
第一次 第二次 第三次 第四次 第五次
256 16 0.7968 0.5448 0.6000 0.6024 0.7899 0.6668
384 24 1.3858 1.8130 1.4065 2.2514 1.4137 1.6541
512 32 2.5346 2.4067 2.6756 4.5683 1.9542 2.8279
640 40 4.3264 3.5319 7.3716 5.8340 2.8486 4.7825
768 48 10.1956 6.9521 5.3732 6.6958 4.1091 6.6652
896 56 6.6307 5.1443 14.0495 14.7396 11.3944 10.3863
1024 64 6.2941 17.1003 12.3989 11.5311 11.0922 11.6833
1152 72 20.3097 15.8271 23.7094 16.2601 13.1304 17.8473
1280 80 26.6514 11.5004 54.1937 13.3371 18.3094 24.7973
不同颜色的单元格表示每行中的最大值和最小值 这种颜色代表行中最大值 这种颜色代表行中最小值
观察表3-1上的统计数据,很容易发现随着加密位数的增加,密钥生成需要的时间显著增加。在测试范围内,随着加密位数增大,每一行中的最大最小值差距也呈粗略的增大趋势。也就是说对于长密钥来说,RSA随机生成密钥消耗时间的可能范围较大。这是因为对于大整数来说,可能出现在较长一段区间中没有素数的情况。
在较常用的1024位RSA加密时,用本软件的算法,测试时最长出现了17秒多的计算,虽然这对于用户来说时漫长的等待,但是考虑到安全性,还是舍弃了素数表和密钥库的方案,而使用大素数随机生成,用户可以把生成的私钥单独加密保存在可靠的存储空间内,以获得更高的安全性。
表3-1仅能从实验的角度直观理解,具体到一次密钥生成的运算,所需要的时间是很不确定的,比如,一次1280位的密钥生成,需要的时间完全可能比一次896位的密钥生成时间短,由于素数分布规律非常奥妙,加上测试运算需要的时间颇长,这里很难给出对于一个具体位数的密钥生成所需时间的统计模型。
另外需要说明的是,表3-1的加密位数在实际软件设置时并不严格。这是因为,实际作为参数设置的是两个大素数的搜索起点。如果随机生成的起点整数大小比较接近更长一位的整数的话(例如FFFF很接近10000),向后寻找所得到的素数很可能长出一位。而且,两个k位长的整数相乘的结果也未必是2k位,比如100*100=10000,相乘结果是2k-1位。所以,在表3-1实际测试填写时,加密位数可能会有几位的差距,但是这不碍大局。
2. 测试底数A对耗时的影响
为了保证生成素数的成功率,A至少要有4个。如果少于4个,则素数测试失败的可能性比较大,经过测试发现不可以忽略。2.2.1.3小节曾经提到,如果素数测试通过了合数,就可能产生错误的密钥,使加密解密操作失败。所以测试A的时候,最少有让其取4个值。而取6个值以上,测试算法失败的概率已经非常小,没有什么实用意义
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>
C++RSA算法文件加密解决方案RSA论文 第7页下载如图片无法显示或论文不完整,请联系qq752018766