作业3RSA实验报告夏磊S1048035.docx
- 文档编号:24329027
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:70
- 大小:1.26MB
作业3RSA实验报告夏磊S1048035.docx
《作业3RSA实验报告夏磊S1048035.docx》由会员分享,可在线阅读,更多相关《作业3RSA实验报告夏磊S1048035.docx(70页珍藏版)》请在冰豆网上搜索。
作业3RSA实验报告夏磊S1048035
信息安全实验报告
作业3-RSA加密解密
姓名:
夏磊
学号:
S1048035
班级:
2010级秋季班
指导教师:
王昭
1设计思路及主要代码分析
1.1实验目的
1、理解RSA加密和解密原理。
2、理解使用RSA进行数字签名和验证的过程
3、大素数生成及验证的算法算法。
1.2实验要求
实现RSA算法,包括素数生成,加密和签名。
并进行加解密正确性测试及性能测试。
1.3设计思路
1.3.1程序流程图
1)主程序流程图
1.3.2实验原理
RSA算法描述:
找两素数p和q
取n=p*q
取t=(p-1)*(q-1)
取任何一个数e,要求满足e 取d*e%t==1 这样最终得到三个数: nde 设消息为数M(M 设c=(M**d)%n就得到了加密后的消息c 设m=(c**e)%n则m==M,从而完成对c的解密。 注: **表示次方,上面两式中的d和e可以互换。 算法关键: 关键在于大素数的生成,这里需要依赖大素数的运算。 大数的输入输出是通过字符串来完成的,事实上很容易实现,例如按照十进制格式进行处理,则: 输入: X=0 FORi=0TOn X=X*10 X=X+(int)(str[n]-48) RETURNX 输出: str= WHILE(X>0) str=(char)(X%10-48)+str RETURNstr 1.3.3设计说明 程序首先随机生成两个大素数P和Q,再生成公钥(E,N)和私钥(D,N) 加解密过程: 读入明文文件,生成加密,然后再进行解密。 数字签名: 读入明文文件,进行签名,然后再验证签名。 (普遍采用的签名都是先对明文数据先做一下MD5摘要,然后再对摘要后的内容进行签名及验证,本实验为有针对性的处理,省略了MD5的过程,直接对明文数据进行签名及验证) 在操作的同时,进行信息提示和计时,以便做性能测试。 1.4程序源代码 1.4.1程序工程结构 1.4.2大数运算代码BigNumber.cpp /***************************************************************** 大数运算库源文件: BigNumber.cpp *****************************************************************/ #include"stdafx.h" #include"BigNumber.h" //小素数表 conststaticintPrimeTable[550]= {3,5,7,11,13,17,19,23,29,31, 37,41,43,47,53,59,61,67,71,73, 79,83,89,97,101,103,107,109,113,127, 131,137,139,149,151,157,163,167,173,179, 181,191,193,197,199,211,223,227,229,233, 239,241,251,257,263,269,271,277,281,283, 293,307,311,313,317,331,337,347,349,353, 359,367,373,379,383,389,397,401,409,419, 421,431,433,439,443,449,457,461,463,467, 479,487,491,499,503,509,521,523,541,547, 557,563,569,571,577,587,593,599,601,607, 613,617,619,631,641,643,647,653,659,661, 673,677,683,691,701,709,719,727,733,739, 743,751,757,761,769,773,787,797,809,811, 821,823,827,829,839,853,857,859,863,877, 881,883,887,907,911,919,929,937,941,947, 953,967,971,977,983,991,997,1009,1013,1019, 1021,1031,1033,1039,1049,1051,1061,1063,1069,1087, 1091,1093,1097,1103,1109,1117,1123,1129,1151,1153, 1163,1171,1181,1187,1193,1201,1213,1217,1223,1229, 1231,1237,1249,1259,1277,1279,1283,1289,1291,1297, 1301,1303,1307,1319,1321,1327,1361,1367,1373,1381, 1399,1409,1423,1427,1429,1433,1439,1447,1451,1453, 1459,1471,1481,1483,1487,1489,1493,1499,1511,1523, 1531,1543,1549,1553,1559,1567,1571,1579,1583,1597, 1601,1607,1609,1613,1619,1621,1627,1637,1657,1663, 1667,1669,1693,1697,1699,1709,1721,1723,1733,1741, 1747,1753,1759,1777,1783,1787,1789,1801,1811,1823, 1831,1847,1861,1867,1871,1873,1877,1879,1889,1901, 1907,1913,1931,1933,1949,1951,1973,1979,1987,1993, 1997,1999,2003,2011,2017,2027,2029,2039,2053,2063, 2069,2081,2083,2087,2089,2099,2111,2113,2129,2131, 2137,2141,2143,2153,2161,2179,2203,2207,2213,2221, 2237,2239,2243,2251,2267,2269,2273,2281,2287,2293, 2297,2309,2311,2333,2339,2341,2347,2351,2357,2371, 2377,2381,2383,2389,2393,2399,2411,2417,2423,2437, 2441,2447,2459,2467,2473,2477,2503,2521,2531,2539, 2543,2549,2551,2557,2579,2591,2593,2609,2617,2621, 2633,2647,2657,2659,2663,2671,2677,2683,2687,2689, 2693,2699,2707,2711,2713,2719,2729,2731,2741,2749, 2753,2767,2777,2789,2791,2797,2801,2803,2819,2833, 2837,2843,2851,2857,2861,2879,2887,2897,2903,2909, 2917,2927,2939,2953,2957,2963,2969,2971,2999,3001, 3011,3019,3023,3037,3041,3049,3061,3067,3079,3083, 3089,3109,3119,3121,3137,3163,3167,3169,3181,3187, 3191,3203,3209,3217,3221,3229,3251,3253,3257,3259, 3271,3299,3301,3307,3313,3319,3323,3329,3331,3343, 3347,3359,3361,3371,3373,3389,3391,3407,3413,3433, 3449,3457,3461,3463,3467,3469,3491,3499,3511,3517, 3527,3529,3533,3539,3541,3547,3557,3559,3571,3581, 3583,3593,3607,3613,3617,3623,3631,3637,3643,3659, 3671,3673,3677,3691,3697,3701,3709,3719,3727,3733, 3739,3761,3767,3769,3779,3793,3797,3803,3821,3823, 3833,3847,3851,3853,3863,3877,3881,3889,3907,3911, 3917,3919,3923,3929,3931,3943,3947,3967,3989,4001 }; //构造大数对象并初始化为零 CBigNumber: : CBigNumber() { m_nLength=1; for(inti=0;i } //解构大数对象 CBigNumber: : ~CBigNumber() { } /**************************************************************************************** 大数比较 调用方式: N.Cmp(A) 返回值: 若NA返回1 ****************************************************************************************/ intCBigNumber: : Cmp(CBigNumberA) { if(m_nLength>A.m_nLength)return1; if(m_nLength for(inti=m_nLength-1;i>=0;i--) { if(m_ulValue[i]>A.m_ulValue[i])return1; if(m_ulValue[i] } return0; } /**************************************************************************************** 大数赋值 调用方式: N.Mov(A) 返回值: 无,N被赋值为A ****************************************************************************************/ voidCBigNumber: : Mov(CBigNumberA) { m_nLength=A.m_nLength; for(inti=0;i m_ulValue[i]=A.m_ulValue[i]; } voidCBigNumber: : Mov(unsigned__int64A) { if(A>0xffffffff) { m_nLength=2; m_ulValue[1]=(unsignedlong)(A>>32); m_ulValue[0]=(unsignedlong)A; } else { m_nLength=1; m_ulValue[0]=(unsignedlong)A; } for(inti=m_nLength;i } /**************************************************************************************** 大数相加 调用形式: N.Add(A) 返回值: N+A ****************************************************************************************/ CBigNumberCBigNumber: : Add(CBigNumberA) { CBigNumberX; X.Mov(*this); unsignedcarry=0; unsigned__int64sum=0; if(X.m_nLength for(unsignedi=0;i { sum=A.m_ulValue[i]; sum=sum+X.m_ulValue[i]+carry; X.m_ulValue[i]=(unsignedlong)sum; carry=(unsigned)(sum>>32); } X.m_ulValue[X.m_nLength]=carry; X.m_nLength+=carry; returnX; } CBigNumberCBigNumber: : Add(unsignedlongA) { CBigNumberX; X.Mov(*this); unsigned__int64sum; sum=X.m_ulValue[0]; sum+=A; X.m_ulValue[0]=(unsignedlong)sum; if(sum>0xffffffff) { unsignedi=1; while(X.m_ulValue[i]==0xffffffff){X.m_ulValue[i]=0;i++;} X.m_ulValue[i]++; if(m_nLength==i)m_nLength++; } returnX; } /**************************************************************************************** 大数相减 调用形式: N.Sub(A) 返回值: N-A ****************************************************************************************/ CBigNumberCBigNumber: : Sub(CBigNumberA) { CBigNumberX; X.Mov(*this); if(X.Cmp(A)<=0){X.Mov(0);returnX;} unsignedcarry=0; unsigned__int64num; unsignedi; for(i=0;i { if((m_ulValue[i]>A.m_ulValue[i])||((m_ulValue[i]==A.m_ulValue[i])&&(carry==0))) { X.m_ulValue[i]=m_ulValue[i]-carry-A.m_ulValue[i]; carry=0; } else { num=0x100000000+m_ulValue[i]; X.m_ulValue[i]=(unsignedlong)(num-carry-A.m_ulValue[i]); carry=1; } } while(X.m_ulValue[X.m_nLength-1]==0)X.m_nLength--; returnX; } CBigNumberCBigNumber: : Sub(unsignedlongA) { CBigNumberX; X.Mov(*this); if(X.m_ulValue[0]>=A){X.m_ulValue[0]-=A;returnX;} if(X.m_nLength==1){X.Mov(0);returnX;} unsigned__int64num=0x100000000+X.m_ulValue[0]; X.m_ulValue[0]=(unsignedlong)(num-A); inti=1; while(X.m_ulValue[i]==0){X.m_ulValue[i]=0xffffffff;i++;} X.m_ulValue[i]--; if(X.m_ulValue[i]==0)X.m_nLength--; returnX; } /**************************************************************************************** 大数相乘 调用形式: N.Mul(A) 返回值: N*A ****************************************************************************************/ CBigNumberCBigNumber: : Mul(CBigNumberA) { if(A.m_nLength==1)returnMul(A.m_ulValue[0]); CBigNumberX; unsigned__int64sum,mul=0,carry=0; unsignedi,j; X.m_nLength=m_nLength+A.m_nLength-1; for(i=0;i { sum=carry; carry=0; for(j=0;j { if(((i-j)>=0)&&((i-j) { mul=m_ulValue[i-j]; mul*=A.m_ulValue[j]; carry+=mul>>32; mul=mul&0xffffffff; sum+=mul; } } carry+=sum>>32; X.m_ulValue[i]=(unsignedlong)sum; } if(carry){X.m_nLength++;X.m_ulValue[X.m_nLength-1]=(unsignedlong)carry;} returnX; } CBigNumberCBigNumber: : Mul(unsignedlongA) { CBigNumberX; unsigned__int64mul; unsignedlongcarry=0; X.Mov(*this); for(unsignedi=0;i { mul=m_ulValue[i]; mul=mul*A+carry; X.m_ulValue[i]=(unsignedlong)mul; carry=(unsignedlong)(mul>>32); } if(carry){X.m_nLength++;X.m_ulValue[X.m_nLength-1]=carry;} returnX; } /**************************************************************************************** 大数相除 调用形式: N.Div(A) 返回值: N/A ****************************************************************************************/ CBigNumberCBigNumber: : Div(CBigNumberA) { if(A.m_nLength==1)returnDiv(A.m_ulValue[0]); CBigNumberX,Y,Z; unsignedi,len; unsigned__int64num,div;///存放中间结果 X.Mov(0); Y.Mov(*this);//被除数 while(Y.Cmp(A)>=0) { div=Y.m_ulValue[Y.m_nLength-1];//被除数最高位 num=A.m_ulValue[A.m_nLength-1];//除数的最高位 len=Y.m_nLength-A.m_nLength; if((div==num)&&(len==0)){X.Mov(X.Add (1));break;}//商是1 if((div<=num)&&len) { len--; div=(div<<32)+Y.m_ulValue[Y.m_nLength-2]; }//被除数加上次高位,再除以除数 div=div/(num+1); Z.Mov(div);//预除下的商给了Z if(len) { Z.m_nLength+=len; //把商左移len长度 for(i=Z.m_nLength-1;i>=len;i--)Z.m_ulValue[i]=Z.m_ulValue[i-len]; //Z的低len长度补0 for(i=0;i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 作业 RSA 实验 报告 S1048035
![提示](https://static.bdocx.com/images/bang_tan.gif)