《密码学课设报告》word版.docx

上传人:jian****018 文档编号:7948766 上传时间:2020-03-26 格式:DOCX 页数:37 大小:799.22KB
返回 下载 相关 举报
《密码学课设报告》word版.docx_第1页
第1页 / 共37页
《密码学课设报告》word版.docx_第2页
第2页 / 共37页
《密码学课设报告》word版.docx_第3页
第3页 / 共37页
点击查看更多>>
资源描述
课 程 设 计 报 告题目 SPN和RSA密码算法的快速实现与安全性分析 课程名称: 密码学基础 专业班级: 信息安全1302班 学 号: 姓 名: 指导教师: 报告日期: 2015年9月4日 计算机科学与技术学院任务书课程设计内容包括以下七个方面:1. 实现密码学基础上的示例SPN,包括加密和解密。2. 对以上SPN分别进行线性和差分分析,猜测出全部32位初始密钥。3. 加强以上SPN的安全性,自己设计一个新的SPN。4. 选择一个10M的没有任何随机性的文件(如全部为0),选择一种对称加密算法的工作模式进行加密,将密文用于随机性测试,将简单SPN和加强SPN的测试结果进行对比。5. 实现RSA参数的生成(素性检测)。6. 实现模重复平方算法,蒙哥马利算法以及运用中国剩余定理,分别在不同的条件下完成加密和解密,比较效率的异同。7. 用改进的SPN和RSA设计出一个文件加密方案并实现。课程设计编程语言:C+;课程设计开发环境:VS2013。目录1 课题背景12 系统设计22.1 简单SPN的设计(课本实例)22.2 简单SPN的线性、差分分析32.3 安全性更好的SPN52.4 随机性检测62.5 RSA参数的生成72.6 实现RSA算法并比较效率102.7 文件加密133 系统实现与总结分析153.1 简单SPN153.2 简单SPN的线性差分分析163.3 安全性更好的SPN183.4 随机性检测203.5 RSA参数的生成223.6 实现RSA算法并比较效率233.7 文件加密284 实验感想315 参考文献326 附录331 课题背景随着信息化世界的发展,网络已深深地介入每一个人的生活,在数据量如此庞大的情况下,数据的安全性,完整性,可靠性等问题就被提上议程。密码学的历史源远流长,而今天我们所研究的正是基于计算机技术的密码技术,密码技术是信息安全技术的核心,它主要由密码编码技术和密码分析技术两个分支组 成。密码编码技术的主要任务是寻求产生安全性高的有效密码算法和协议,以满足对消息进 行加密或认证的要求。密码分析技术的主要任务是破译密码或伪造认证信息,实现窃取机密 信息或进行诈骗破坏活动。目前人们将密码理论与技术分成两大类,一类是基于数学的密码理论与技术,包括公钥密码、分组密码、序列密码、认证码、数字签名、Hash 函数、身份 识别、密钥管理、PKI 技术、VPN 技术等;另一类是非数学的密码理论与技术,包括信息隐 藏、量子密码、基于生物特征的识别理论与技术等。本文主要对前者进行了实践研究。分组密码:美国早在 1977 年就制定了自己的数据加密标准DES。随着 DES 的出现,人们对分 组 密 码 展开了深入的研究和讨论。现已有大量的分组密码,如 DES 的各种变形、IDEA 算法、 SAFER 系列算法、RC 系列算法、Skipjack 算法、Rijndael 算法、FEAL 系列算法、REDOC 系列算法、LOKI 系列算法,CAST 系列算法、Khufu、Khafre、MMB、3-WAY、TEA、MacGuffin、 SHARK、BEAR、LION、CA.1.1、CRAB、Blowfish、GOST、SQUARE、MISTY,等等。公钥密码:自从 1976 年公钥密码的思想提出以来,国际上已经提出了许多种公钥密码体制,如基 于大整数因子分解问题的 RSA 体制和 Rabin 体制、基于有限域上的离散对数问题的 Diffie-Hellman 公钥体制和 ElGamal 体制、基于椭圆曲线上的离散对数问题的 Diffie-Hellman 公钥体制和 ElGamal 体制、基于背包问题的 Merkle-Hellman 体制和 Chor-Rivest 体制、基于 代数编码理论的 MeEliece 体制、基于有限自动机理论的公钥体制等等。分组密码分析:分组密码分析技术伴随着分组密码的发展也得到了空前的发展。已有很多分 20 通 信 学 报 2002 年 组密码分析技术,如强力攻击(包括穷尽密钥搜索攻击、字典攻击、查表攻击、时间-存储权 衡攻击)、差分密码分析、差分密码分析的推广(包括截段差分密码分析、高阶差分密码分析、 不可能差分密码分析)、线性密码分析、线性密码分析的推广(包括多重线性密码分析、非线 性密码分析、划分密码分析)、差分-线性密码分析、插值攻击、密钥相关攻击、能量分析、 错误攻击、定时攻击等等。2 系统设计2.1 简单SPN的设计(课本实例)2.1.1 设计思想SPN的是一种将明文划分为固定长度的分组再分别进行加密的算法,对每一组明文的加密过程中,要经过多轮密码变换的处理,由一个初始密钥通过某种密钥编排方案产生用于每一轮的轮密钥,每一轮密码变换都是经过了相同的处理,如与轮密钥异或,S盒代换,P盒置换等,而解密则是加密的逆过程,对于S盒和P盒都要作相应的逆处理,因此实现算法的核心就在于实现S盒和P盒。加解密对象采用整型,以整数的每一个二进制位上的0或1表示分组中的01串。代替-置换网络是一种简单的迭代密码,处理的明文单元和状态值长度为 lm 。轮函数g包括两个核心变换代替和置换,分别记为 s和p,有 s : (0,1)l (0,1)l , p : 1,2,.,lm 1,2,.,lm.在进行轮函数变换前,先用轮 密钥和状态值进行异或。 SPN密码体制定义如下: 设 l,m,Nr 是正整数,P=C=0,1lm。 K(0,1lm)Nr+1 是由初始密钥 k 用密钥 编排算法生成的所有可能的密钥编排方案集合,一个密钥编排方案记为 (k1,k2,.,kNr+1) .状态值w长度为lm,记为 w1,w2,.,wlm ; w可以看成m个长度为l的子串连接而成,记为 w=w1,w2,.,wm. 其中 wi = w(i1)l+1,w(i1)l+2,.,w(i1)l+l . 其中最后一轮不进行置换,加密的开始和结尾均是异或运算。 2.1.2 设计结构S盒:const int sub16 = 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7 ;由于S盒是4位一组进行代换,因此在S盒变换前应对数据进行再分组,每一组为4位。所有组分别进行了代换以后再组合到一起作为输出。如下:for (int i = 0; i NUM_TEAM; i+)tempi = subtempi;tempi = tempi (NUM_TEAM-i-1) input output)for (i = 0; i input1output1input2output2)for (i = 0; i 256; i+)if (d_substitution(output1 tempi) d_substitution(output2 tempi)&0x0f0f) = 0x0606)+counti;其中input1,input2为明文,output1,output2为密文,两个明文之间有着固定的差分关系,if语句内的内容表示将两个密文通过候选密钥进行解密得到最后一轮代换的输入以后,若存在固定的差分关系(相对于明文的差分关系最可能的)则候选密钥频数加一。穷举密钥求解出余下的密钥:上述线性分析和差分分析方法在明密文对足量的情况下可以求出一定比特的密钥子集,而对于求解所有32位初始密钥的余下子密钥,则采用暴力求解的方法,取出明密文对中的一到两对,用余下密钥的候选密钥结合已经猜测出的密钥分别对明文进行加密,若能得到相应的密文,则可以判断出正确密钥的所在。线性分析暴力求解:for (i = 0; i 65536; i+)generate_key(temp_key, (i 16) | analyze_key);if (SPN(input, temp_key) = output)break;其中SPN为加密操作,generate_key为通过初始密钥产生轮密钥的过程。analyze_key是通过线性分析已得到的部分密钥。差分分析暴力求解:for (i = 0; i 412)|(i&0x00000f)48)|(analyze_key&0x0f);if (SPN(input1, temp_key) = output1) & (SPN(input2, temp_key) = output2)break;各符号含义与上相同。2.3 安全性更好的SPN2.3.1 设计思想:将分组长度加长到64位一组,采用安全性更好的S盒(AES的S盒),采用两个不同的S盒,均是以8位为输入和输出。并且将加解密的轮数提高到50轮,并且调整密钥编排方案,借鉴了流密钥的加密方案,同时调整初始密钥和在文件加密中调整初始向量LV,可以达到加强随机性的效果。2.3.2 设计结构密钥编排:初始密钥为64位,以后的密钥在此基础之上派生而出,每64位划分为一个轮密钥:for (i = 0; i NUM_TEAM; i+)temp_2i = tempi;for (; i (NUM_TEAM + (ROUND + 1) 4); i+)temp_2i = temp_2i - 3 temp_2i - 5 temp_2i - 6 temp_2i - 8 temp_2i - 10 temp_2i - 14;for (i = 0; i ROUND + 1; i+)round_keyi = (temp_2(i + 1) 4) 60) | (temp_2(i + 1) 4) + 1 56) | (temp_2(i + 1) 4) + 2 52) | (temp_2(i + 1) 4) + 3 48) | (temp_2(i + 1) 4) + 4 44) |(temp_2(i + 1) 4) + 5 40) | (temp_2(i + 1) 4) + 6 36) | (temp_2(i + 1) 4) + 7 32) | (temp_2(i + 1) 4) + 8 28) | (temp_2(i + 1) 4) + 9 24) | (temp_2(i + 1) 4) + 10 20)| (temp_2(i + 1) 4) + 11 16) | (temp_2(i + 1) 4) + 12 12) | (temp_2(i + 1) 4) + 13 8) | (temp_2(i + 1) 4) + 14其中第一个和第二个for循环是产生密钥流的过程,第三个for循环是将密钥流以64位为一组放入轮密钥数组的过程,以后每轮中参与运算的轮密钥便由这个数组中的相应位置产生。S盒:由于AES的S盒元素较多有256位在此不列出,每一轮的64位以8位为一组使用8个相同的S盒进行代换以后再重新结合在一起:for (i = 0; i 8; i+)tempi = subtempi;tempi = tempi (7 - i) 3);for (i = 0; i 8; i+)output = output | tempi;其中temp数组为把数据分成八组分别代入S盒的过程,output为S盒最后的输出(64位)。P盒:简单的置换。加解密:以加密为例,与课本上的SPN不同之处在于,除了位数的变化以外。每相邻两轮的S盒是不一样的,核心部分实现如下:for (r = 0; r (ROUND - 1); r+)k = k % 2;output = round_keyr output;output = substitution(output, subk);output = p(output);k+;其中k为标记使用哪个S盒的变量,两个S盒交替使用。2.4 随机性检测2.4.1 设计思想为了检测密码算法的唯一性,对毫无随机性的足够大的文件进行加密,采用CBC工作模式,对加密结果进行随机性测试。2.4.2 设计结构产生明文:产生10M的全0文件,即文件中所有字符均为0。加密:CBC加密模式,由于改进后的SPN为64位一组进行加密,则每次从文件中取8个字符,定义一个将字符转换为整型的子函数,用于把8个连续的字符按照位数结合成一个unsigned long long型的数与上一组的密文异或运算进行加密,加密结果按照位数分成8个字符写入到密文文件中。第一次加密时明文异或的是初始向量LV。对于简单的SPN做类似处理,不同之处在于每次取2个字节。加密及写入文件部分如下:while (fin.read(a, 8)x = str_num(a)y;y = SPN(x, round_key);for ( j = 0; j 8; j+)temp = y (j 56;fout.write(char*)&temp,sizeof temp);其中字符型变量temp的作用是将密文分成8个字节,从密文的高位开始每次取一个字节赋值给temp,将temp写入到文件中,这样文件中保留的值就是字符的值。2.5 RSA参数的生成2.5.1 设计思想RSA作为非对称密码算法,其密钥组成可分公钥和私钥两部分。其中公钥由e(加密时的指数),n(模)组成,私钥由p(大整数n分解的一个因子),q(大整数n分解的另一个因子),d(解密时的指数)组成,e一般取65536,d是e模n的欧拉函数的逆。而参数的生成核心就在于生成p和q这两个大素数,一般取512位。所以只需要一个判断素数的函数,再随机生成指定位数的大整数进行素性检测即可。将其中用到的大数运算附于下,如图2.1:图 2.12.5.2 设计结构素性检测采用MR算法,判定为素数且正确的概率为0.25,因此需要产生大量的测试数据才能保证有充足的概率依据支持得到的为素数。MR算法设计如下:BIGNUM* temp_a = BN_new();BIGNUM* n_1 = BN_new();BN_copy(n_1, num); /num中的大数复制到n_1中BN_sub_word(n_1, 1); /n_1中的大数减一int k = 0, i;int n = BN_num_bits(n_1); /n_1中的大数二进制位数for (i = 0; i n; i+)if (!BN_is_bit_set(n_1, i) /若n_1的第i位为0k+;elsebreak;BIGNUM* temp = BN_new();BN_rshift(temp, n_1, k); /右移k位BIGNUM* mod = BN_new();BIGNUM* b = BN_new();BN_CTX *ctx = BN_CTX_new();BN_CTX_init(ctx);BN_mod_exp(b, a, temp, num, ctx); /b=atemp(mod num)if (BN_is_one(b) /若b为1return 1; elsefor (i = 0; i = 0; i-)BN_mod_mul(result, result, result, n, ctx);if (BN_is_bit_set(e, i)BN_mod_mul(result, result, num, n, ctx);其中result,num,e,n分别表示结果,底数,指数和模。蒙哥马利算法:分成蒙哥马利算法和蒙哥马利乘法两部分。为方便运算,采用二进制蒙哥马利乘法,如下:int n = BN_num_bits(N);BIGNUM* z = BN_new();BIGNUM* rem = BN_new();BN_CTX *ctx = BN_CTX_new();BN_CTX_init(ctx);BN_zero(z);for (int i = 0; i n; i+)if (BN_is_bit_set(x, i)BN_add(z, z, y);if (BN_is_odd(z)BN_add(z, z, N);BN_rshift1(z, z);if (BN_cmp(z, N) = 1) | (BN_cmp(z, N) = 0)BN_sub(z, z, N);return z;其中Z为返回结果,该算法用于计算x*y*r-1(mod N),r=2n,n为N的二进制位数。蒙哥马利算法:(mont_mult为蒙哥马利乘法)BIGNUM* result = BN_new();BN_CTX *ctx = BN_CTX_new();BN_CTX_init(ctx);BN_mod(num, num, N, ctx);int k = BN_num_bits(e);BIGNUM* K = BN_new();BN_mod_exp(K, bn_2, bn_2n, N, ctx);BIGNUM* P0 = BN_new();BIGNUM* R0 = BN_new();P0 = mont_mult(K, num, N);R0 = mont_mult(K, bn_1, N);for (int j = 0; j k; j+)if (BN_is_bit_set(e, j)R0 = mont_mult(R0, P0, N);P0 = mont_mult(P0, P0, N);result = mont_mult(R0, bn_1, N);return result;中国剩余定理:将n写为p*q的形式,就可以将原来的模幂式写成一个方程组,可以大大减少每个每个方程的指数,且由方程的结果计算得到最终结果时需要的中间参数可通过预计算得出:BN_mod(e_p, d, p_1, ctx); BN_mod(e_q, d, q_1, ctx);其中e_p和e_q分别为模p和模q的方程中的指数,由欧拉定理得到。BN_mod_inverse(n_p, p, q, ctx); /求逆函数BN_mod_inverse(n_q, q, p, ctx);BIGNUM* vector_p = BN_new();BN_mul(vector_p, q, n_q, ctx);/运用中国剩余定理时模p的子式应该乘以的因子,即q*q-1(mod p)BIGNUM* vector_q = BN_new();BN_mul(vector_q, p, n_p, ctx);/运用中国剩余定理时模p的子式应该乘以的因子,即p*p-1(mod q)加解密和时间统计:预先产生10000个1024bit的大整数作为加密对象。预先产生RSA的参数及中国剩余定理的参数放入generate_key文件中,加解密时从中取出并参与运算。将加解密结果以及运算时间都分别写入到文件中,命名规则为加密/解密用到的具体方法+加密/解密/时间。2.7 文件加密2.7.1 设计思想针对RSA适用于较短文件如密钥口令的加密,SPN适用于较长文件的加密,于是对于一个文件,首先用RSA加密SPN的密钥,再用SPN加密文件中的全部内容,特别注意的是短块处理。2.7.2 设计结构加密:首先用RSA加密SPN的密钥,将它写入到密文文件中,并输出回车符和换行符作为解密时的划分依据。加密文件之前为了便于短块处理首先统计出明文文件中所有的字节数,将需要短块处理的字节数定义为所有的字节数模上8的结果(18)。加密文件时,每次从明文文件中取出8个字节一起转换为unsigned long long型的整数异或上前一组的密文进行加密(第一组加密异或的是LV)。进行短块处理时,将剩余的地方都用需要补上的字节数代替。加密的操作在随机性监测中已出现故在此不再赘述,加密短块处理方式如下:while (fin2.read(char*)&temp, sizeof temp)ai = temp;i+;for (; i 8; i+)ai = r;x = str_num(a) y;y = SPN(x, round_key);for (j = 0; j 8; j+)temp = y (j 56;fout.write(char*)&temp, sizeof temp); 其中r为需要短块处理的字节数。 解密:首先也是统计密文文件中所有的字节数,再以回车换行符为标志找到RSA加密结果的分解处,减去这些得到真正用于文件加密的字节数。然后除以8得到组数,保留每一组的密文用于下一组SPN解密结果的异或,一组一组迭代进行,将解密结果写入解密还原文件中,文件操作依然是二进制形式。for (k = 8; k text_length; k = k + 8)fin.read(char*)&a0, sizeof a0);fin.read(char*)&a1, sizeof a1);fin.read(char*)&a2, sizeof a2);fin.read(char*)&a3, sizeof a3);fin.read(char*)&a4, sizeof a4);fin.read(char*)&a5, sizeof a5);fin.read(char*)&a6, sizeof a6);fin.read(char*)&a7, sizeof a7);p_x = x;x = str_num(a);y = D_SPN(x, round_key) p_x;for (j = 0; j 8; j+)temp = y (j 56;fout.write(char*)&temp, sizeof temp);其中text_length是SPN加密的实际长度,p_x是前一组的密文,x所示当前组的密文。短块还原处理:解密得到最后一组的密文以后,取出最后一组密文还原后的最后一个字节则是短块处理的位数,将文件指针移到此位数前将之后的字节都改为0即可。int r = y & 0x00000000000000ff;fout.seekp(-r, ios:end);for (j = 0; j r; j+)fout 0;3 系统实现与总结分析3.1 简单SPN 3.1.1 系统实现加密时有如下操作:图 3.1解密时有如下操作:图 3.23.1.2 总结分析为了实现更高效率的算法,我前后采用了字符数组和无符号整型这两种数据类型存储加密对象,比较得知,前者不仅由于一个0或1就要用一个字节去存储会比较耗费内存以外,速度也是远不及后者。在加解密过程中,有大量的位运算按,而对于计算机硬件而言,位运算是一种效率很高的运算,与计算机连接更为紧密,更底层。因此最终决定采用unsigned int来表示加解密对象,把整型数的每一个二进制位上的0或1看作是加解密对象的01串组合,除了从键盘中读取和输出到屏幕上需要与字符串做一个转换以方便观测以外其余操作都很简便。3.2 简单SPN的线性差分分析3.2.1 系统实现线性分析产生的明密文对:图 3.3线性分析的结果:图 3.4差分分析产生的明密文对:图 3.5差分分析的结果:图 3.63.2.2 总结分析线性分析中我设计了一种可以分析出16位密钥的分析方法,通过观察S盒的线性逼近表逆推得出。在明密文对不断减少的尝试中最终发现,在只需要几十对明密文的情况下就可以得到正确的结果。而余下的16位密钥采用暴力破解的方法,由于未知密钥数比较少,而且只需要1到2对明密文就可以试出,因此花的时间也较少。差分分析我用的是书上的方法,产生了五百个四元组,以猜测出8位密钥,剩下的照例采用暴力破解。这两种办法中采用暴力破解的时候除了所有的可能密钥都要逐一尝试以外,要注意把已经猜测出来的密钥安插在合适的位置以结合成全部32位密钥进行暴力破解。比较这两种方法的速度可以发现,差分分析比线性分析略快。虽然差分分析用到的明密文对更多,但由于需要分析的密钥只有8位,循环次数大大减少,而虽然暴力破解的位数更多,但暴力破解只需要1到2对明密文即可,因此分析密钥位数更少的差分分析在速度上略胜一筹。而比较分析密钥所需明密文对可知,为了得到正确的密钥线性分析比差分分析需要的明密文对数更少。3.3 安全性更好的SPN3.3.1 系统实现解密时有如下操作:图 3.7加密时有如下操作:图 3.83.3.2 总结分析为了达到随机性测试的要求,最开始我是将16位分组加长到32位分组,还是沿用4位一组的S盒,最多的时候甚至用到了64个不同的S盒,均是用了随机数生成函数生成的,然而即使把轮数提高到35轮,也无法满足所有的随机性要求。后来我认为是S盒强度不够的问题,于是我采用了AES的S盒,以8位为一组进行代换,这样做有一定的效果,结果是所有的测试中有5项无法通过,即使不断地尝试用不同的LV和初始密钥,也始终有不能通过的。最终,我把分组长度加长到了64位,(没有尝试用128位是因为考虑到整型的方便与高效,而整型的最大长度就是unsigned long long为64位),为了加强安全性,我也幸运地发现了AES还有一个不同的S盒,当然我很快就把它也放了进去作为相邻两轮间加密时交替使用的S盒。这样一来第一次尝试没有通过的项就减少为两项了,然后我注意到LV还是32位的,把它改成64位的大数以后,终于通过了全部的测试。通过以上这些尝试的过程我发现,在写诸如分组长度,组数,轮数之类参数可能会变的情况下,用宏定义申明它们的值,在涉及到它们的函数中以宏代替出现的地方,这样不仅看起来整齐直观,而且易于修改,因此我在不断地修改当中也没有花费太多的重复操作。然而有一些隐含的地方还是需要仔细找出并加以修改的,比如上文中提到的LV,当分组长度改变时,数据类型也发生了改变,需要修改的地方还很多,这也要求程序员对自己的程序充分熟悉。3.4 随机性检测3.4.1 系统实现课本上的SPN的部分检测结果: 所有的测试项中一共有104项未通过。图 3.9安全性更好的SPN部分测试结果如下:所有测试全部通过。图 3.103.4.2 总结分析在正式开始随机性测试之前,了解如何测试和知道如何看待测试结果是至关重要的。由于一开始不知道用于测试的文件应该是什么样的,就直接将加密结果(整型数据)存入,后来不管如何改变,测试结果都非常不乐观。后来才发现,将整型数据存入文件之后,存入的并不是数值,而是那个数的每一个数字的ASCII码,也就是说,这样密文中出现的字符只有可能表示数字,范围非常小,做随机性测试时自然效果非常不好。而应该存入的是加密结果的值,因此我设定了一个用于整型和字符型间转换的中间变量temp,从高位开始每次取一个字节将它的值赋给temp,再将temp写入文件,这样才达到了应该测试的效果,真正意义上的尝试与探索也才开始。因此了解文件写入读出的格式是十分重要,有时候在结果不令人满意之前,需要先考虑一些基本的条件有没有得到满足而不是盲目改进。3.5 RSA参数的生成3.5.1 系统实现生成素数:图 3.11检测:图 3.123.5.2 总结分析此算法并不复杂,只需充分了解其原理后按照步骤往下用程序实现即可,需要注意的是用到的openSSL库中的数据类型与普通的不一样,要能转换。此外,由于此算法并不是确定性算法,为了使结果更可靠,需要有足量不同的参数作为输入,主函数中会多次调用MR算法,若对于所有的输入参数都能有素性检测成功的结果,那么我们有理由相信这次的结果是正确的。3.6 实现RSA算法并比较效率3.6.1 系统实现使用蒙哥马利算法完成对10000个1024bit明文进行加密:图 3.13使用模重复平方算法完成对10000个1024bit明文进行加密:图 3.14未使用openSSl库写的蒙哥马利算法:图 3.15使用蒙哥马利算法解密:图 3.16使用蒙哥马利结合中国剩余定理解密:图 3.17使用模重复平方算法解密:图 3.18使用模重复平方及中国剩余定理解密:图 3.19明文部分截图:图 3.20三种加密方式得到的密文部分截图:1.蒙哥马利:图 3.212.模重复平方:图 3.223.自己编写的蒙哥马利:图 3.23四种解密方式得到的还原明文部分截图:1. 蒙哥马利:图 3.242. 模重复平方:图 3.253. 蒙哥马利&中国剩余定理:图 3.264. 模重复平方&中国剩余定理图 3.27将时间写入相应文件以方便程序运行结束后比对:图 3.283.6.2 总结分析由先导知识我们知道蒙哥马利算法是一种尽量用加法和移位运算代替复杂的乘和模运算的高效算法,而模重复平方算法则是在模幂运算中经藏用到的一类运算方法,因此蒙哥马利算法的效率是最高的。由于我自己写的模重复平方算法里用到的步骤很少而且直接用到openSSL库里的函数,因此单看加密,在指数较小的情况下,其加密速度较openSSL库中的蒙哥马利算法并没有减少很多。而自己模拟蒙哥马利算法的时候,由于此算法的精髓就在于大量加减和移位运算没有耗费时间的乘法运算,然而当数据类型是BIGNUM*型时,那些本来很简单的操作就会变得比较复杂,失去其最大的优势,因此即使是在把除法运算改为移位运算(都是openSSL库中的),再尽量做好相应的预处理的情况下,此算法的效率跟前面两个相比仍有较大差距。而从解密可以看出,在使用了中国剩余定理的情况下,解密的速度可以提高三倍多,这跟理论分析是很接近的。中国剩余定理不仅可以把模的数长度减少一半,只要掌握了私钥,其关键数据还可以进行预处理。3.7 文件加密3.7.1 系统实现明文文件:图 3.29解密还原后的文件:图 3.30密文文件:(第一行为RSA加密SPN的初始密钥后的结果)图 3.313.7.2 总结分析文件加密时RSA和SPN的综合应用,原理并不复杂,但是涉及到了我们并不十分熟悉的文件操作,因此还是碰了一些壁,也学到了一些东西。将SPN的密钥加密放在最前面,既方便区分,也顺应了文件指针读取密文文件数据的顺序,将其密钥解密还原后就可以进行下面文件的解密了。文件读写应用二进制的形式。为了检测自己的算法,应该尝试各种测试文件,大的小的,什么样的符号都应该试一下,测试的越多才越能保证其正确性,才能发现那些影藏的错误。4 实验感想通过这次课程设计我们把课本上的理论真正搬到了现实,加深了对理论知识的理解,也锻炼了写程序的能力。一开始的时候写得还比较顺利,出于之前些其他算法的经验,只要能实现相应功能,对效率问题好像没有过多深究。毕竟对于小程序而言在强大的计算机面前效率上些许差异难以察觉。然而这一次的课程设计由于涉及复杂的运算较多,而且加密对象也很庞大,我第一次感觉到算法的效率也是很重要的。比如说SPN,对于采用字符数组来存储加密对象和采用整型来存储加密对象,进行的操作不一样,占用的内存也不一样,后者的速度竟能快上前者很多倍。这让我深切地认识到,即使资源很充足也不能随意浪费,应力所能及地在保证算法的功能健全情况下尽力改善算法的效率。写程序的过程中也遇到了很多问题,最大的问题就是文件操作的问题。开始的时候把文件操作想的太简单,好像也很容易就实现了文件加密的算法。但是在一组测试数据中,应是加密出了无效字符存入了密文文件中,解密时文件指针读到该无效字符误认为已经到了文件尾,于是只解密了部分数据。为了解决这个问题,我翻阅书上有关文件操作的相关说明,尝试了各种办法都是停在无效字符那里没办法继续往下读。后来得到了前辈的指教,知道应该用二进制的方式打开文件,才能把包括无效字符在内的所有字符都算在文件字节总数中,这一次好像又成功了。紧接着我用更大的文件测试算法时,又出现了意想不到的问题。对于只有小文件适用而稍微大一点的文件就不能成功我感到非常奇怪,百思不得其解中,有一位同学说要用二进制读写,我才恍然大悟。原来一直以来我只是用二进制形式打开,并没有采用二进制的读写形式。为了确保正确性,我在加密和解密的程序中有文件操作的地方均采用了二进制读写,这一次才真的顺利通过了后来的所有测试。这次课程设计可以说是从课本走向现实的依次窥视,纵然明白密码学在实际生活中的重要意义,也需亲手实践才能拉近它与我们之间的距离,才能设身处地地考虑密码学中的诸多问题,这不管是从学习能力还是探究精神上都是一次提升。5 参考文献【1】密码学原理与实践(第三版). DouglasR.Stinson著,冯登国译,电子工业出版社,2009【2】应用密码学:协议算法与C源程序(第二版). Bruce Schneier著,吴世忠等译,机械工业出版社,20146 附录感谢华中科技大学计算机学院信息安全所的诸位老师的悉心教导以及同学的热心帮助!拜谢各位读者的批评指正。 熊雅媛华中科技大学计算机学院 2015年9月5日
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!