实验报告 课程: 现代密码学 班级: 姓名: 学号: 成绩: 指导教师: 实验日 期及时间: 201 1/5/11 座位号: 18 必修/选修: 必修 实验序号: 3 实验名称: 求剩余类环的模逆元; 编程实现 B—M 算法 一、 实验目的: 1, 求模逆元的目的: (1)掌握求最大公因子的欧几里得算法的实现; (2) 掌握剩余类环 Zn 中乘法逆元算法的实现; (3) 判断剩余类环 Zn 中元素的可逆性。 2, 实现 B—M 算法的目的: (1) 能够用 C 语言编程实现 B—M 算法; (2) 能够上机求出长为 N<=的序列的最短 LFSR; (3) 能够上机求出长为 N<=的序列的线性复杂度; (4)用 B—M 算法破译直接用 LFSR 输出序列作为密钥流进行加解密运算的序列密码算法。 二、 实验要求: 1,求逆元的要求:(1)对任意输入的正整数 d, 首先判断其是否是 Zn 中的元素, 然后判断 d 在 Zn 中是否有逆元,最后输出判断结果。 (2) 程序计算结果正确。 2, 实现 B—M 算法:(1) 编制 B—M 算法程序, 并输出最短 LFSR 的级数和最短 LFSR的联接多项式。 (2) 程序计算结果正确。 三、 实验内容及完成情况: 1、 设计一个求逆运算, 先输入模数 t, 再输入可逆元 d, 结果得出其逆元 w。 设模数为 35, 可逆元为 13, 结果逆元为 27 完成情况截图如下: 2, 设计一个 B—M 算法, 输入一串序列, 得到其 n, Ln, d, Fn, Fm 四、 实验步骤: 1、 实验思路 A,求逆元: 主要的运算思想见下图: 按图所示, 在 C 语言程序下, 编写算法。 主要用到判断 if 语句来实现算法过程。 B,B—M 算法:根据 B—M 算法的实验原理, 用 if,else 函数依次实现 2、 实验过程 A,求逆元: (1) 编写交换函数 gcd,实现 x.y 互换。 (2) 编写逆元函数 niyuan, 实现求逆过程。 (3) 创建主函数, 在主函数中输入模数和可逆元, 并调用 gcd, niyuan 函数, 使其求出逆元 。 B,求 B—M 算法: (1) 建 printp 函数, 在此函数中实现多项式的生成; (2) 建主函数, 在主函数中调用 printp 函数并按算法步骤实现程序 (3) 输入序列并输出该序列对应的 n, Ln, d, Fn, Fm 的值。 五、 实验体会: 在这次实验中我学到很多东西, 了解如何把密码的理论基础中的辗转相除法用在实际的求逆程序中和如何实现 B—M 算法。 首先, 在写求逆函数的过程中对 b1,b2,b3,r1,r2,r3 的关系产生混乱, 在静下心仔细思考后才明白过来它们之间的关系。 接下来做的就是主函数的调用, 在本程序中采用 cin,cout 作为输入输出函数, 这样是使程序能更有效的实施 在求 B—M 算法的程序中由于其算法比较复杂, 在把其用程序实现的过程中遇到很多麻烦, 在这里花了较长时间。 通过这次实验使我对知识本身有着更深的了解, 希望以后实验能学到更多知识。 附录 1. 求逆元 #include "stdio. h" #include "string. h" #include "iostream. h" int gcd(int x, int y) { int z; while(x>1) { z=x; x=y%x; y=z; } if(x==1) return 1; return 0; } int niyuan(int n, int a) { int b1=0, b2=1, b3, q, r1, r2, r3; r1=n; r2=a; q=r1/r2; r3=r1%r2; b3=b1-q*b2; while(r3>1) { r1=r2; r2=r3; b1=b2; b2=b3; q=r1/r2; r3=r1%r2; b3=b1-q*b2; } return b3; } void main() { int i, w, t; printf("输入模数 t: ") ; scanf("%d", &t) ; printf("Zn 中的可逆元: ") ; for(i=0; i<=t; i++) { if(gcd(i, t) ) cout<>w; cout<<"其逆元: "<<(niyuan(t, w) +t) %t<1) { printf("x^%-3d", i) ; j+=5; } else { (i==1) ?printf("x") : printf("1") ; j++; } } for(i=0; iL) { m=n; for(i=0; i<=L;i++) ff[i]=g[i]; LL=L; L=n+1-L; } } } } printf("\b%3d ", n, d) ; printp(f, L, 30) ; printf(" %3d\n", L) ; }