




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验4 信息隐藏和加解密 关于DES和RSA加密算法的实验报告实验环境与实验目的:C语言,完成对记事本格式文件的信息隐藏(加密)和提取(解密)过程。DES算法概述:DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位,密钥事实上是56位参与DES运算(第8、16、24、32、40、48、56、64位是校验位, 使得每个密钥都有奇数个1)分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。DES算法实现过程:从子密钥Ki的生成算法描述图中我们可以看到:初始Key值为64位,但DES算法规定,其中第8、16、.64位是奇偶校验位,不参与DES运算。故Key 实际可用位数便只有56位。即:经过缩小选择换位表1的变换后,Key 的位数由64 位变成了56位,此56位分为C0、D0两部分,各28位,然后分别进行第1次循环左移,得到C1、D1,将C1(28位)、D1(28位)合并得到56位,再经过缩小选择换位2,从而便得到了密钥K0(48位)。依此类推,便可得到K1、K2、.、K15。实验代码段(des.cpp):#include memory.h#include #include stdio.h#include string.h#include fstreamenum ENCRYPT,DECRYPT; /ENCRYPT=0 表示加密DECRYPT=1表示解密char bufer1024; /定义了一个1024个字符组来充当计算过程中的临时变量char key64; /定义了一个接受密匙的字符组char context1024; /定义了一个1024个字符的组来存储明文 和密文的空间/DES的初始置换IP表const static char IP_Table64 = 58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 20, 12, 4,62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,57, 49, 41, 33, 25, 17, 9, 1,59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7;/DES的IP逆置换表 const static char IPR_Table64 = 40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31,38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27,34, 2, 42, 10, 50, 18, 58, 26,33, 1, 41, 9, 49, 17, 57, 25;/DES加密过程的选为表Estatic const char E_Table48 = 32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9,8, 9, 10, 11, 12, 13,12, 13, 14, 15, 16, 17,16, 17, 18, 19, 20, 21,20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29,28, 29, 30, 31, 32, 1;/ 32位置换函数P使用的S盒的输出const static char P_Table32 = 16, 7, 20, 21,29, 12, 28, 17, 1, 15, 23, 26,5, 18, 31, 10,2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6,22, 11, 4, 25;/ 置换选择表PC-1const static char PC1_Table56 = 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4;/置换选择表PC-2 const static char PC2_Table48 = 14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32;/循环左移运算表const static char LOOP_Table16 = /1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,161,1,2,2,2,2,2,2,1, 2, 2, 2, 2, 2, 2,1;/S盒运算 const static char S_Box8416 = /盒S1 14, 4,13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13,/盒S2 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15, 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9,/盒S3 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12,/盒S4 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14,/盒S5 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3,/盒S6 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,/盒S7 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12,/盒S8 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11;typedef bool (*PSubKey)1648; /这里用bool来表示 一个位bool Des_Go(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);/*调用DESOut输出缓冲区 In 是输入的字符组 可能是明文也可能是密文,Key是密匙,keylen是密匙的长度,Type表示解密或加密 */static void DES(char Out8, char In8, const PSubKey pSubKey, bool Type);/标准DES加/解密static void SetKey(const char* Key, int len); / 设置密钥 key 字符组 len是key字符组的长度static void SetSubKey(PSubKey pSubKey, const char Key8);/ 设置子密钥static void F_func(bool In32, const bool Ki48);/ f 函数static void S_func(bool Out32, const bool In48);/ S 盒代替static void Transform(bool *Out, bool *In, const char *Table, int len);/ 变换static void Xor(bool *InA, const bool *InB, int len);/ 异或static void RotateL(bool *In, int len, int loop);/ 循环左移static void ByteToBit(bool *Out, const char *In, int bits);/ 字节组转换成位组static void BitToByte(char *Out, const bool *In, int bits);/ 位组转换成字节组void savefile(const char * s,char c,char *fn);/用来进行文档的写/static bool SubKey21648;/ 16圈子密钥static char Tmp256, deskey16;/*主体加密解密函数*/bool Des_Go(char *Out, char *In, long datalen, const char *Key, int keylen, bool Type) if( !( Out & In & Key & (datalen=(datalen+7)&0xfffffff8) ) ) return false;SetKey(Key, keylen);for(long i=0,j=datalen3; i16?16:len); /设置子密匙SetSubKey(&SubKey0, &deskey0);/每八位一组的DES运算void DES(char Out8, char In8, const PSubKey pSubKey, bool Type) static bool M64, tmp32, *Li=&M0, *Ri=&M32; ByteToBit(M, In, 64); Transform(M, M, IP_Table, 64); if( Type = ENCRYPT )/进行16轮迭代进行加密 for(int i=0; i=0; -i) memcpy(tmp, Li, 32); F_func(Li, (*pSubKey)i); Xor(Li, Ri, 32); memcpy(Ri, tmp, 32); Transform(M, M, IPR_Table, 64); BitToByte(Out, M, 64);void SetSubKey(PSubKey pSubKey, const char Key8) / static bool K64, *KL=&K0, *KR=&K28; /把字节转化成位数据ByteToBit(K, Key, 64);/通过PC-1置换选择表进行置换 Transform(K, K, PC1_Table, 56); /进行16轮的迭代for(int i=0; i16; +i) /对左部的28位进行 左循环 RotateL(KL, 28, LOOP_Tablei); /对右部的28位进行 左循环 RotateL(KR, 28, LOOP_Tablei); /根据 PC-2置换选择表进行置换 Transform(*pSubKey)i, K, PC2_Table, 48); /进行F函数运算void F_func(bool In32, const bool Ki48) static bool MR48; Transform(MR, In, E_Table, 48); Xor(MR, Ki, 48); S_func(In, MR); Transform(In, In, P_Table, 32);/进行S函数运算(S盒)void S_func(bool Out32, const bool In48) for(char i=0,j,k; i8; +i,In+=6,Out+=4) j = (In01) + In5; k = (In13) + (In22) + (In31) + In4;ByteToBit(Out, &S_Boxijk, 4); /通过指定的置换表进行数据置换void Transform(bool *Out, bool *In, const char *Table, int len) for(int i=0; ilen; +i) Tmpi = In Tablei-1 ; memcpy(Out, Tmp, len);/进行异或运算void Xor(bool *InA, const bool *InB, int len) for(int i=0; ilen; +i) InAi = InBi;/进行循环左移运算void RotateL(bool *In, int len, int loop) memcpy(Tmp, In, loop); /获取In字符组的前loop个字符 memcpy(In, In+loop, len-loop);/把In字符数组的后len-loop移到数组的开头 memcpy(In+len-loop, Tmp, loop);/把loop个字符补到末尾/把字符转化为位void ByteToBit(bool *Out, const char *In, int bits) for(int i=0; i3(i&7) & 1;/通过移位获取每一个字符的第一个位的值/把位转化为数组void BitToByte(char *Out, const bool *In, int bits) memset(Out, 0, bits3); for(int i=0; i3 |= Ini= (datalen+7)/8)*8,即比datalen大的且是8的倍数的最小正整数 In 可以= Out,此时加/解密后将覆盖输入缓冲区(In)的内容 当keylen8时系统自动使用3次DES加/解密,否则使用标准DES加/解密.超过16字节后只取前16字节 In 是输入的字符组 可能是明文也可能是密文,Key是密匙,keylen是密匙的长度,Type表示解密或加密 */bool Des_Go(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);RSA算法概述:RSA公钥加密算法是1977年由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准。今天只有短的RSA钥匙才可能被强力方式解破。到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式。只要其钥匙的长度足够长,用RSA加密的信息实际上是不能被解破的。但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。在公开密钥密码体制中,加密密钥(即公开密钥)PK是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然秘密密钥SK是由公开密钥PK决定的,但却不能根据PK计算出SK。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。RSA是被研究得最广泛的公钥算法,从提出到现今的三十多年里,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA算法实现过程:RSA算法实现细节:密钥生成首先要使用概率算法来验证随机产生的大的整数是否质数,这样的算法比较快而且可以消除掉大多数非质数。假如有一个数通过了这个测试的话,那么要使用一个精确的测试来保证它的确是一个质数。除此之外这样找到的p和q还要满足一定的要求,首先它们不能太靠近,此外p-1或q-1的因子不能太小,否则的话N也可以被很快地分解。此外寻找质数的算法不能给攻击者任何信息,这些质数是怎样找到的,尤其产生随机数的软件必须非常好。要求是随机和不可预测。这两个要求并不相同。一个随机过程可能可以产生一个不相关的数的系列,但假如有人能够预测出(或部分地预测出)这个系列的话,那么它就已经不可靠了。比如有一些非常好的随机数算法,但它们都已经被发表,因此它们不能被使用,因为假如一个攻击者可以猜出p和q一半的位的话,那么他们就已经可以轻而易举地推算出另一半。此外密钥d必须足够大,1990年有人证明假如p大于q而小于2q(这是一个很经常的情况)而,那么从N和e可以很有效地推算出d。此外e = 2永远不应该被使用。速度比起DES和其它对称算法来说,RSA要慢得多。实际上Bob一般使用一种对称算法来加密他的信息,然后用RSA来加密他的比较短的对称密码,然后将用RSA加密的对称密码和用对称算法加密的消息送给Alice。这样一来对随机数的要求就更高了,尤其对产生对称密码的要求非常高,因为否则的话可以越过RSA来直接攻击对称密码。密钥分配和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡一个从中取代的攻击。假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。理论上Alice和Bob都不会发现Eve在偷听他们的消息。今天人们一般用数字认证来防止这样的攻击。时间攻击1995年有人提出了一种非常意想不到的攻击方式:假如Eve对Alice的硬件有充分的了解,而且知道它对一些特定的消息加密时所需要的时间的话,那么她可以很快地推导出d。这种攻击方式之所以会成立,主要是因为在进行加密时所进行的模指数运算是一个位元一个位元进行的而位元为1所花的运算比位元为0的运算要多很多,因此若能得到多组讯息与其加密时间,就会有机会可以反推出私钥的内容。RSA用到的公式和定理一、数和互为素数任何大于1的整数a能被因式分解为如下唯一形式:a=p1p2pl(p1,p2,pl为素数)二、模运算a(mod n)b(mod n)modn(ab)(mod n)如果(ab)=(ac)(mod n),a与n互素,则b=c(mod n)三、费马定理若p是素数,a与p互素,则a(p-1)1 (mod p)四、欧拉定理欧拉函数(n)表示不大于n且与n互素的正整数的个数。当n是素数,(n)=n-1。n=pq,p,q均为素数时,则(n)= (p)(q)=(p-1)(q-1)。对于互素的a和n,有a(n)1(mod n)代码段:#include#include#includetime.husing namespace std;#define VLONG unsigned longVLONG prime_a;VLONG prime_b;VLONG n;VLONG PHI;VLONG e=2;VLONG d=0;VLONG gcd_number=1; /最大公约数VLONG m;VLONG C;VLONG D;/最大公约数VLONG gcd(VLONG n1, VLONG n2)if (n1=0 | n2=0) return 0;int t;if (n1n2)A:if (n2%n1=0)return n1;elsefor (int i=2;i=n1/2;i+)while (n1%i=0 & n2%i=0)gcd_number=gcd_number*i;n1=n1/i;n2=n2/i;if (n1a;for (int i=2;i=PHI | e=1)goto B;coute= e ; /*while (gcd(e,PHI)!=1) /置随机数种子。e = 1+rand()%PHI;coute= eendl;*/* 密钥库 */void getD()for (int i=0;i10;i+)PHI=PHI*PHI; / 循环保安全while ( (PHI*PHI) % e !=1)PHI=PHI*PHI;d = PHI/e;coutd= d ;void getEE()VLONG great=0;while (gcd(e,PHI)!=1)e=e+1;coute= e ;/求u mod m的逆元素算法,快速计算:gcdu,m=au+bm=1,p136(替换getD)void getDD(VLONG /*mod*/ m,VLONG u)VLONG n1=m;VLONG n2=u;long b1=0;long b2=1;long t;VLONG
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年事业单位工勤技能-河南-河南药剂员四级(中级工)历年参考题库含答案解析
- 2024版医用口罩采购合同范本
- 2024版工程项目管理人员聘用合同
- 2025年事业单位工勤技能-河北-河北计算机信息处理员一级高级技师历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河北-河北水利机械运行维护工一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河北-河北地质勘查员四级(中级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-河北-河北保健按摩师四级(中级工)历年参考题库含答案解析
- 2025年事业单位工勤技能-江苏-江苏有线广播电视机务员四级(中级工)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-江苏-江苏公路养护工一级(高级技师)历年参考题库含答案解析(5套)
- 2025年事业单位工勤技能-广西-广西机械冷加工五级(初级工)历年参考题库含答案解析
- 绿色工厂培训课件
- 制造业的网络安全培训
- 接触网工程图识图 六跨电分相绝缘锚段关节安装图的识图
- 工业厂房监理规划范本
- 急性心肌梗死的护理PPT
- 花卉学 二年生花卉
- 《矿业权评估指南》
- 机动车维修竣工出厂合格证样式
- 管道工程隐蔽验收记录表
- 手机拍照技巧大全课件
- 微课(比喻句)讲课教案课件
评论
0/150
提交评论