已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
密码学课程设计报告 古典密码、DES算法实现、大素数生成 算法原理分析及编程实现。计算机学院 信安08-3班 柴婷婷2011-6-26目录0 引言11 古典密码11.1 Vigenere(维吉尼亚)密码11.1.1 vigenere密码算法原理11.1.2 vigenere密码表及举例说明11.1.3 运行结果21.2 Playfair 加解密31.2.1 Playfair算法描述31.2.2 对明文的加密描述31.2.3对密文的解密规则41.2.4运行结果41.3 Vernam(弗纳姆)加解密51.3.1 Vernam算法描述51.3.2 运行结果62 DES算法的实现62.1 算法描述62.2 算法分析72.2.1 DES加密过程72.2.2 加密时的5个主要函数82.2.3 DES解密过程102.3 运行结果103 大素数生成算法113.1 算法描述113.2 加密、解密过程123.3素数的测试123.3.1 Solovay-Strassen检测法123.3.2 Miller-Rabin检测法133.4 运行结果134 结束语14250 引言密码学是信息安全专业的专业专业主干课。通过课程的学习,我们可以了解密码学在信息安全中所起到的重要作用。本课程要求我们掌握应用密码学的基本概念,熟悉典型的密码算法及实现,掌握典型的安全协议,熟悉密码协议设计与分析的基本方法。此课程设计主要包括三个部分:古典密码加解密实现、DES算法的实现、大素数生成。1 古典密码实验目的:掌握多表古典加密方法。实验要求:能用高级语言实现古典加密方法。实验内容:多表古典加密方法主要有Playfair体制、Vigenere体制、Beaufor体制、Vernam体制和Hill体制,用高级语言实现其中一种体制的加密和解密算法。1.1 Vigenere(维吉尼亚)密码1.1.1 vigenere密码算法原理维吉尼亚密码引入了“密钥”的概念,即根据密钥来决定用哪一行的密表来进行替换,以此来对抗字频统计。维吉尼亚密码的密钥空间大小为26n,所以即使n的值很小,使用穷尽密钥搜索方法也需要很长的时间。1.1.2 vigenere密码表及举例说明参照下表,假如以上面第一行代表明文字母,左面第一列代表密钥字母,对如下明文加密: CHAI TING TING JIA MI当选定CHU LAN TIAN作为密钥时,加密过程是:明文一个字母为C,密钥第一个字母为C,因此可以找到在C行中代替C的为E,依此类推,得出对应关系如下: 密钥:CHUL ANTI ANCH ULA NTI 明文:CHAI TING TING JIA YOU密文:EOUT TVGO TVPN DTA LHC1.1.3 运行结果在visual C+ 6.0编译环境下,输入附录一所列代码实现vigenere密码算法的加解密,运行结果如下:1.2 Playfair 加解密1.2.1 Playfair算法描述Playfair密码出现于1854年,它依据一个5*5的正方形组成的密码表来编写,密码表里排列有25个字母。如果一种语言字母超过25个,可以去掉使用频率最少的一个。英语中z使用最少,可以去掉它。法语一般去掉w或k,德语则是把i和j合起来当成一个字母看待。1.2.2 对明文的加密描述第一步是编制密码表。在这个5*5的密码表中,共有5行5列字母。第一列(或第一行)是密钥,其余按照字母顺序。密钥是一个单词或词组,若有重复字母,可将后面重复的字母去掉。当然也要把使用频率最少的字母去掉。第二步整理明文。将明文每两个字母组成一对。如果成对后有两个相同字母紧挨或最后一个字母是单个的,就插入一个字母X。对明文加密规则如下: 1 若p1 p2在同一行,对应密文c1 c2分别是紧靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct对应oc 2 若p1 p2在同一列,对应密文c1 c2分别是紧靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。 3 若p1 p2不在同一行,不在同一列,则c1 c2是由p1 p2确定的矩形的其他两角的字母(至于横向替换还是纵向替换要事先约好,或自行尝试)。如按照前表,wh对应tk或kt。1.2.3对密文的解密规则 对密文解密规则如下:1 若c1 c2在同一行,对应明文p1 p2分别是紧靠c1 c2 左端的字母。其中最后一列被看做是第一列的左方。 2 若c1 c2在同一列,对应明文p1 p2分别是紧靠c1 c2 上方的字母。其中最后一行被看做是第一行的上方。 3 若c1 c2不在同一行,不在同一列,则p1 p2是由c1 c2确定的矩形的其他两角的字母。 其实就是反其道而行之。如密钥LOVELY GIRL,可编制成 lGCKSOIDMTVRFNUEAHPWYBJQX1.2.4运行结果在visual C+ 6.0编译环境下,输入附录二所列代码实现playfair密码算法的加解密,运行结果如下:1.3 Vernam(弗纳姆)加解密1.3.1 Vernam算法描述Vernam加密规则如下:1)按递增顺序把每个明文字母作为一个数字,A=0,B=1等等。2)对输入密文中每一个字母做相同的处理。3)将明文中的每个字母与密钥中的相应字母相加。4)如果得到的和大于26,则进行模26的运算。5)将和转化为字母,从而得到密文。例如 明文: H O W A R E Y O U 7 14 22 0 17 4 24 14 20 + 2.密钥 N C B T Z Q A R X 13 2 1 19 25 16 0 17 23 3.初始和 20 16 23 19 42 20 24 31 43 4.大于25则模26 20 16 23 19 16 20 24 5 17 5.密文 U Q X T Q U Y F R1.3.2 运行结果在visual C+ 6.0编译环境下,输入附录三所列代码实现Vernam密码算法的加解密,运行结果如下:2 DES算法的实现实验目的:掌握分组加密算法的设计与实现方法。实验要求:用高级语言实现实现DES加密和解密算法。实验内容:DES是由初始变换、乘积变换和逆初始变换构成,乘积变换是DES算法的核心。首先用代码实现这几个变换,然后组合成DES加密算法。由于DES解密算法与加密算法相同只是子密钥使用次序不同,因此可简单地由加密算法实现解密算法。2.1 算法描述DES算法为密码体制中的对称密码体制,又被成为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。其密钥长度为56位,明文按64位进行分组,将分组后的明文组和56位的密钥按位替代或交换的方法形成密文组的加密方法。入口参数有三个:key、data、mode。 key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。当模式为加密模式时,明文按照64位进行分组,形成明文组,key用于对数据加密,当模式为解密模式时,key用于对数据解密。实际运用中,密钥只用到了64位中的56位,这样才具有高的安全性。2.2 算法分析2.2.1 DES加密过程DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。令i表示迭代次数,表示逐位模2求和,f为加密函数2.2.2 加密时的5个主要函数(1)int des_setup(const unsigned char *key, in keylen, int num_rounds, des_key*skey)函数名称:密钥生成函数参数说明:key 是一个指针,指向用户输入的初始密钥。keylen 是输入密钥的长度,以字节为单位。num_rounds 是加密轮数,当输入0 时,使用算法默认的轮数。skey 是一个指向结构体变量的指针,变量里面存储加密和解密时每轮使用的子密钥。当密钥生成时,返回值为 CRYPT_OK(0),结果保留在skey 指向的结构体。des_key 的定义为:typedef struct des_keyulong32 ek32,dk32;des_key;结构体des_key 里的ek 存储加密时用的子密钥,dk 存储解密时用的子密钥。结构体中用2 个32 位的整数来存储一轮的48 位密钥,每一个32 位整数被分成4个8 位,每个8 位的第6 位存储密钥。如果把48 位密钥分成8 组,则这8 组按存储的顺序从高到低分别为1、3、5、7、2、4、6、8。这样做是为了加密时可以把扩展和查表运算结合进行。(2)void des_ecb_encrypt (const unsigned char *pt,unsigned char *ct, des_key *key)函数名称:ECB 模式下的DES 加密函数。参数说明:pt 是指向待加密的明文数组的指针。ct 是指向存储加密结果的指针。key 是调用密钥生成函数后存储每一轮子密钥的结构体变量。加密成功时,返回 CRYPT_OK。(3)void des_ecb_decrypt (const unsigned char *ct,unsigned char *pt, des_key *key)函数名称:ECB 模式下的DES 加解密函数。参数说明:ct 是指向待解密的明文数组的指针。pt 是指向存储解密结果的指针。key 是调用密钥生成函数后存储每一轮子密钥的结构体变量。加密成功时,返回 CRYPT_OK。加密和解密时,pt 和ct 可以指向同一块内存。(4)int des_test(void)函数名称:测试函数。这个函数用来对加密算法进行测试。函数体内部定义了对应的明文和密文数组,并且进行了多轮加密和解密。这个函数还可以用来测试函数的运行时间。(5)int des_keysizet(int *desired_keysize)函数名称:密钥长度检验函数。2.2.3 DES解密过程令i表示迭代次数,表示逐位模2求和,f为加密函数2.3 运行结果在visual C+ 6.0编译环境下,输入附录四所列代码实现DES密码算法的加解密,运行结果如下:3 大素数生成算法实验目的:进一步掌握大素数分解的一般原理和实现方法。实验要求:能用间接方法实现大素数分解。实验内容:用代码实现Solovay-Strassen素性测试法或Miller-Rabin 素性测试法。3.1 算法描述非对称密码也被称作公钥密码,其思想是由 WDiffie 和 Hellman 在1976年提出的。不同于以往的加密技术,非对称密码术是建立在数学函数基础上的,而不是建立在位方式的操作上的。更重要的是,与只使用单一密钥的传统加密技术相比,它在加/解密时,分别使用了两个不同的密钥:一个可对外界公开,称为“公钥”;一个只有所有者知道,称为“私钥”。公钥和私钥之间具有紧密联系,用公钥加密的信息只能用相应的私钥解密,反之亦然。同时,要想由一个密钥推知另一个密钥,在计算上是不可能的。RSA 公钥密码体制的安全性是基于大数的因子分解的困难性 因为迄今没有找到一个有效算法可用于分解因子。RSA 算法的具体实现过程如下:(1)生成两个大素数 p 和 q;(2)计算 n = p q, ( n ) = ( p-1) ( q-1);(3)选择随机数(e即加密密钥),使之满足0 e ( n ),且gcd ( e, ( n ) )=1;(4)计算解密密钥 d e-1 mod ( n );(5)公布整数 n 和加密密钥 e。3.2 加密、解密过程假设要加密的明文为n(0 nm),将n的e次方用m除后得到余数c,c为密文这就是加密过程;将密文c的d 次方用 m 除后得到的余数刚好为 n,即明文,这就是解密过程。3.3素数的测试检查一个正整数N是否为素数,最简单的方法就是试除法。将该数N用小于等于的所有素数去试除,若均无法整除,则N为素数。但这种方法在目前的计算机运算水平下对大素数的判断是无能为力的。目前对一个大整数作素数性进行检验的方法分为两类:确定性素数检验法和概率测试法。确定性素数检验法能准确确定一个数 n 是否为素数,目前虽然理论上已有准确测试一大整数的素数性的方法,但如何能产生适于RSA体制用的素数还未能完全解决,因为构成素数易产生规律性,密码分析人员容易根据规律追踪素数的变化,直到猜测到RSA 系统所用的素数。一般说来,判定一个大的数是素数比较难,而否定它是素数则要容易得多,我们已有一个简便而有效的算法能将大量合数淘汰出去。当前采用的素数概率测试法例如有 S o l o v a y -Strassen 检测法、 Lehman 检测法和 Miller-Rabin 检测法。3.3.1 Solovay-Strassen检测法Robert Solovag和Volker Strasson开发了一种概率的基本测试算法这个算法使用了雅可比函数来测试n是否为素数,其原理为:令随机选取a ,计算雅可比函数J(a,x) 若x为素数 则gcd(x,a)=1 且J(a,x)= modx 。若 x 不为素数,则至多有 1/2 的概率使上式成立。若 x通过了t次检验,则x不是素数的概率将为。3.3.2 Miller-Rabin检测法原理:令,m为基数。任选一正整数,检测若a满足上述两条件,则x必为合数(由Fermat定理)。理论证明:若x通过了检验,则x不是素数的概率 小于等于1/4,若x通过了 t 次检验,则 x 不是素数的概率同样为。3.4 运行结果在visual C+ 6.0编译环境下,输入附录五所列代码实现大素数密码算法的加解密,运行结果如下:4 结束语历时12周的密码学课程设计就要结束了,在这12周的时间里,我实践了密码学里主要的经典密码,包括:三个多表古典加密和解密程序、DES算法的实现、实现一个大素数生成算法的实验。这些实验对编程能力的要求很强,而我在这方面比较欠缺,所以有许多代码是参考了网上资料和班级同学的,在自己的理解下,我基本掌握了这些密码算法的编程实现过程,纠正了许多以往学习中的理论错误,提升了编程能力。 附录一:vigenere源代码#include #include using namespace std;const int N=26;char vNN=A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z;int number(char x)/把行号字母对应到数字 char y=a; for(int i=0;iN;i+) if(x=(y+i) return i; void encryption(string m,string k)/加密 coutm; coutk; int mlen,klen; mlen=m.length(); klen=k.length(); char *p,*q,*t;/明文,初始密钥,密钥串。把string换成char p=new charm.length()+1; strcpy(p,m.c_str(); q=new chark.length()+1; strcpy(q,k.c_str(); t=new charm.length()+1; int j=0; for(int i=0;imlen;i+) ti=qj; j+; j=j%klen; /生成密钥 cout密文:; for(i=0;imlen;i+) coutvnumber(ti)number(pi); coutendl;void disencryption(string c,string k)/解密 coutc; coutk; int clen,klen; clen=c.length(); klen=k.length(); char *p,*q,*t;/密文,初始密钥,密钥串。把string换成char p=new charc.length()+1; strcpy(p,c.c_str(); q=new chark.length()+1; strcpy(q,k.c_str(); t=new charc.length()+1; int j=0; for(int i=0;iclen;i+) ti=qj; j+; j=j%klen; /生成密钥 cout明文:; for(i=0;iclen;i+) for(int j=0;jN;j+) if(vnumber(ti)j=pi) coutchar(j+97);break; coutendl;int main() for(int i=1;iN;i+) for(int j=0;jN;j+) vij=vi-1(j+1)%N; /方阵初始化 cout欢迎使用Vigenere加密!endlendl; cout请选择要进行的操作endl; int flag; do cout1.加密2.解密3.结束:flag; string m,k; if(flag=1)encryption(m,k); else if(flag=2) disencryption(m,k); else if(flag!=1&flag!=2&flag!=3) cout输入错误,请重新输入!; while(flag!=3); return 0;附录二:playfair源代码#include #include #include #define NUM 1000int main()int i,j,k=0,m,n,temp=0,length;char keyNUM,voa26;char table55;char wordNUM;printf(欢迎使用playfair加密!);printf(密钥: );scanf(%s,key);length=strlen(key); for(i=0;ilength;i+) if(keyi=j) keyi=i;for(i=0;ilength;i+) for(j=i+1;jlength;j+) if(keyi=keyj) for(int t=j;tlength;t+) keyt=keyt+1; j-; length-; if(j=1) keyj=0; break; for(i=0;i26;i+) voai=65+i;for(i=0;ilength;i+) keyi=keyi-32;char p;int count=0;for(i=0;i26;i+) p=voai; for(j=0;jlength;j+) if(p=keyj) keyi+length=p; count+=1; break; if(j=length) keyi+length-count=p;int u=0;for(i=0;i26;i+) if(keyi=J) for(u=i;u26;u+) keyu=keyu+1; if(keyi=I) keyi=*;temp=0;for(i=0;i5;i+) for(j=0;j5;j+) tableij=keyj+temp; printf(%c ,tableij); if(j=4) temp+=5; printf(n); printf(明文: );scanf(%s,word);length=strlen(word);int counter=0;for(i=0;ilength;) if(wordi=wordi+1) i+=1; counter+=1; Else i+=2;for(i=0;ii+1;j-) wordj=wordj-1; wordi+1=x; length=length+counter;if(length%2!=0) wordlength=x; length+=1;for(k=0;klength;k+) wordk=wordk-32;for(i=0;ilength;i+) if(wordi=I|wordi=J) wordi=*; count=0,k=0; loop: for(i=0;i5,klength;i+) for(j=0;j5;j+) for(m=0;m5;m+) for(n=0;n5;n+) if(tableij=wordk)&(tablemn=wordk+1)&(i=m) count=1; wordk=tableij+1; wordk+1=tablemn+1; if(j=4) wordk=tablei0; if(n=4) wordk+1=tablem0; k+=2; if(count=1) goto loop; else if(tableij=wordk)&(tablemn=wordk+1)&(j=n) count=1; wordk=tablei+1j; wordk+1=tablem+1n; if(i=4) wordk=table0j; if(m=4) wordk+1=table0n; k+=2; if(count=1) goto loop; else if(tableij=wordk)&(tablemn=wordk+1)&(i!=m)&(j!=n) count=1; wordk=tablein; wordk+1=tablemj; k+=2; if(count=1) goto loop; printf(密文: );for(k=0;klength;k+) printf(%c ,wordk);printf(n); system(pause);return 0;附录三:vernam源代码#include #include #include using namespace std;int main() string plain,ciper,key; int len; /长度三者一致 void change(string &, vector&);/字符变数字 vector encrypt_compute(vector m,vector k);/加密计算 vector discrypt_compute(vector c,vector k);/解密计算 void re_change( vector&,string &);/数字变字符 cout欢迎使用Vernam加解密:endl; cout=endl; int flag; /操作标记 do cout请选择操作:1、加密 2、解密 3、结束:flag; if(flag=1) coutplain; coutkey; len = plain.size(); vector p,c,k; /存变换的数字 change(plain, p); change(key, k); /字母-数字 c = encrypt_compute(p,k); re_change(c,ciper); /数字-字母 cout密文是:ciperendl; if(flag=2) coutciper; coutkey; len = ciper.size(); vector p,c,k; /存变换的数字 change(ciper, c); change(key, k); /字母-数字 p = discrypt_compute(c,k); plain=;/清空明文原来的值 re_change(p,plain); cout明文是:plainendl; while(flag!=3); return 0;void change(string &plain, vector&number) /字母变数字 for (unsigned int i=0;iplain.size();i+) number.push_back(plaini-97); /a为0 vector encrypt_compute(vector m,vector k) /加密计算 vector sum; for(unsigned int i=0; im.size(); i+) sum.push_back(mi+ki)%26); return sum;vector discrypt_compute(vector c,vector k) /解密计算 vector resum; int temp; for(unsigned int i=0; ic.size(); i+) temp = ci-ki; if(temp0) temp+=26; resum.push_back(temp); return resum;void re_change( vector& sum,string &c) /数字变字符 string temp;/用于处理insert函数变量传递 for (unsigned int i=0;isum.size();i+) temp=sumi+97; c.insert(i,temp);/a为0 附录四:DES算法实现#include #include using namespace std;const static char ip = /IP置换 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; const static char fp = /zuizhongzhihuan 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;const static char sbox864 = /s_box /* 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;const static char rar = /ya suo zhi huan 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 ei = /kuo zhan zhi huan 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;const static char Pzh=/P置换 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;const static char Keyrar= 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;bool key1648=0,/*rekey1648,*/char key_in8;void ByteToBit(bool *Out,char *In,int bits)/字节到位的转换int i;for(i=0;i(i%8)&1;void BitToByte(char *Out,bool *In,int bits)/位到字节转换for(int i=0;ibits/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 不锈钢水箱合同范本
- 个人抵债协议书范本
- 供应商物流合同范本
- 内燃机供应合同范本
- 出资项目投资协议书
- 借用厂房参茶协议书
- 山东东营市事业单位招考人员易考易错模拟试题(共500题)试卷后附参考答案
- 服装店房东合同范本
- 出售花园的合同范本
- 印刷专用标志协议书
- 青少年无人机课程:第一课-马上起飞
- 护工照顾老人协议书范本
- DB29-296-2021 海绵城市雨水控制与利用工程设计规范
- 风电波动性电源对电解水制氢电解槽影响的研究进展
- 中医诊疗技术规范
- 义务教育质量监测应急专项预案
- ZY-T 001.9-1994 中医骨伤科病证诊断疗效标准
- 美术作品与客观世界 课件-2023-2024学年高中美术湘美版(2019)美术鉴赏
- 八年级上册语文全品作业本电子版
- GB/T 893-2017孔用弹性挡圈
- GB/T 29531-2013泵的振动测量与评价方法
评论
0/150
提交评论