- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
PAGE
PAGE 1
实验一 初等数论实验
1.1模指数运算
模指数运算(Modular Exponentiation)在密码学中占有重要地位。公钥密码体制(例如RSA、ELGammal)、单向散列函数以及它们的应用都需要用到模指数运算。
一、实验目的
熟悉模指数运算算法,通过编程实现一种模指数运算算法,加深对模指数运算的理解。
二、实验原理
在模指数算法中,运算ae mod m最后都转化为一系列的模乘法运算,其转换方法构成模指数算法的核心。实现模指数运算的最直接的方法是利用模运算的性质,将模指数运算ae mod m转换为,即进行e-1次a模m的乘法运算。这种方法虽然简单,但是运算效率很低。减少模指数运算中模乘法的次数是一种提高模指数运算速度的有效方法。以下介绍一种常用的模指数运算算法,通过减少模乘法次数提高模指数运算的速度。
二进制算法
设e = (en-1 en-2… e0)2,且en-1 0,是指数e的二进制表示。求ae mod m的二进制算法描述如下:
(1) 置,且i ← n – 2;
(2) 置t ← t ? t mod m;
(3) 若ei = 1,置t ← t? a mod m;
(4) 置i ← i - 1;若i ≥ 0转到步骤(2);
(5) 输出。
二进制算法的模乘法次数为,其中是指数的二进制表示中1的个数。
三、实验环境
操作系统:Windows 2000/XP/2003或以上版本。
应用软件:VC++ 6.0。
实验软件包:MOD工程。
四、实验内容和任务
本实验要求学生在掌握常用的模指数运算算法的基础上,运用高级程序设计语言编程实现模指数运算函数,并通过具体运算测试函数的功能。表1-1给出模指数运算函数的接口定义,作为编程实现的参考。以二进制算法为例,模指数运算函数modExpFun(a,e,m)的程序流程图如 REF _Ref252890439 \h 图1- 1所示。
图1- SEQ 图2- \* ARABIC 1二进制算法流程图
表1- SEQ 表2- \* ARABIC 1 模指数运算函数接口
函数
long modExpFun (long a, int e, long m)
功能
计算ae mod m的值
输入
a (底数),e (指数),m (模数)
输出
幂剩余;
-1,表示输入参数不全为正整数;
-2,表示输入模数为0。
出错处理
输入参数a,m或e为负整数,r = -1
输入参数m为0,r = -2
模指数运算的界面实例如图1- SEQ 图2- \* ARABIC 2所示。在空白框中输入模指数运算ae mod m的三个参数:底数、指数和模数。点击“计算”按钮,执行模指数运算操作。点击“清空”按钮,清空所有参数的输入,以便重新输入参数值。
图1- 2模指数运算实例
五、实验步骤
本实验的大致步骤如下:
安装好所需的操作系统和VC++6.0集成开发环境。
下载实验软件包MOD工程。如果还不熟悉VC++6.0的集成开发环境,请参考相关书籍熟悉其界面、窗口、常用调试命令等。
根据本实验指导书以及MOD工程中的MODDlg.cpp和modExpFun.cpp的提示,完成模指数运算的“计算”和“清空”两个按钮的程序,实现各自的功能。
利用第六部分的测试用例,测试程序。如果不能得到正确结果,调试程序直至获得正确结果。
六、测试用例
以下提供两个测试用例,用于学生检测实现的模指数运算器正确与否。
【用例1】输入a = 2, e = 1234, m = 789, 模指数运算结果为 r = 481,如图1-3所示。
图1- 3用例1的模指数运算结果
【用例2】输入a = 1234, e = 667, m = 18577, 模指数运算结果为 r = 4445,如图1-4所示。
图1- 4用例2的模指数运算结果
原创力文档


文档评论(0)