版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上實(shí)驗(yàn)4 信息隱藏和加解密 關(guān)于DES和RSA加密算法的實(shí)驗(yàn)報(bào)告實(shí)驗(yàn)環(huán)境與實(shí)驗(yàn)?zāi)康模篊語(yǔ)言,完成對(duì)記事本格式文件的信息隱藏(加密)和提?。ń饷埽┻^(guò)程。DES算法概述:DES算法為中的對(duì)稱密碼體制,又被稱為,是1972年美國(guó)IBM公司研制的對(duì)稱密碼體制。 明文按64位進(jìn)行分組,長(zhǎng)64位,密鑰事實(shí)上是56位參與DES運(yùn)算(第8、16、24、32、40、48、56、64位是校驗(yàn)位, 使得每個(gè)密鑰都有奇數(shù)個(gè)1)分組后的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。DES算法實(shí)現(xiàn)過(guò)程:從子Ki的生成算法描述圖中我們可以看到:初始Key值為64位,但DES算法規(guī)定,
2、其中第8、16、.64位是,不參與DES運(yùn)算。故Key 實(shí)際可用位數(shù)便只有56位。即:經(jīng)過(guò)縮小選擇換位表1的變換后,Key 的位數(shù)由64 位變成了56位,此56位分為C0、D0兩部分,各28位,然后分別進(jìn)行第1次循環(huán)左移,得到C1、D1,將C1(28位)、D1(28位)合并得到56位,再經(jīng)過(guò)縮小選擇換位2,從而便得到了K0(48位)。依此類推,便可得到K1、K2、.、K15。實(shí)驗(yàn)代碼段(des.cpp):#include "memory.h"#include <tchar.h>#include "stdio.h"#include "
3、string.h"#include "fstream"enum ENCRYPT,DECRYPT; /ENCRYPT=0 表示加密DECRYPT=1表示解密char bufer1024; /定義了一個(gè)1024個(gè)字符組來(lái)充當(dāng)計(jì)算過(guò)程中的臨時(shí)變量char key64; /定義了一個(gè)接受密匙的字符組char context1024; /定義了一個(gè)1024個(gè)字符的組來(lái)存儲(chǔ)明文 和密文的空間/DES的初始置換IP表const static char IP_Table64 = 58, 50, 42, 34, 26, 18, 10, 2,60, 52, 44, 36, 28, 2
4、0, 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,
5、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加密過(guò)程的選為表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
6、,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位置換函數(shù)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,
7、 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,
8、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;/循環(huán)左移運(yùn)算表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盒運(yùn)算 const static char S_Box8416 = /盒S1 14, 4,
9、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、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,
11、 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
12、, 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
13、, 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
14、, 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來(lái)表示 一個(gè)位bool Des_Go(char *Out,char *In,
15、long datalen,const char *Key,int keylen,bool Type = ENCRYPT);/*調(diào)用DESOut輸出緩沖區(qū) In 是輸入的字符組 可能是明文也可能是密文,Key是密匙,keylen是密匙的長(zhǎng)度,Type表示解密或加密 */static void DES(char Out8, char In8, const PSubKey pSubKey, bool Type);/標(biāo)準(zhǔn)DES加/解密static void SetKey(const char* Key, int len); / 設(shè)置密鑰 key 字符組 len是key字符組的長(zhǎng)度static void
16、 SetSubKey(PSubKey pSubKey, const char Key8);/ 設(shè)置子密鑰static void F_func(bool In32, const bool Ki48);/ f 函數(shù)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 v
17、oid RotateL(bool *In, int len, int loop);/ 循環(huán)左移static void ByteToBit(bool *Out, const char *In, int bits);/ 字節(jié)組轉(zhuǎn)換成位組static void BitToByte(char *Out, const bool *In, int bits);/ 位組轉(zhuǎn)換成字節(jié)組void savefile(const char * s,char c,char *fn);/用來(lái)進(jìn)行文檔的寫/static bool SubKey21648;/ 16圈子密鑰static char Tmp256, deskey1
18、6;/*主體加密解密函數(shù)*/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=datalen>>3; i<j; +i,Out+=8,In+=8)DES(Out, In, &
19、;SubKey0, Type);return true;/對(duì)字符進(jìn)行每8個(gè)一組的分組/* SetKeyz這個(gè)函數(shù)用來(lái)設(shè)置密匙,當(dāng)輸入的密匙長(zhǎng)度超過(guò)16個(gè)字節(jié)時(shí)只截取前16字節(jié)*/void SetKey(const char* Key, int len)/對(duì)密匙存儲(chǔ)空間進(jìn)行初始化memset(deskey, 0, 16);/當(dāng)密匙的長(zhǎng)度大于16時(shí)截取前16字節(jié),否則去實(shí)際字符長(zhǎng)度memcpy(deskey, Key, len>16?16:len); /設(shè)置子密匙SetSubKey(&SubKey0, &deskey0);/每八位一組的DES運(yùn)算void DES(char O
20、ut8, 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 )/進(jìn)行16輪迭代進(jìn)行加密 for(int i=0; i<16; +i) memcpy(tmp, Ri, 32); F_func(Ri, (*pSubKey)i); Xor(Ri, Li, 32); memcpy(Li, tmp, 32); else
21、/進(jìn)行16輪逆迭代進(jìn)行解密 for(int i=15; 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; /把字節(jié)轉(zhuǎn)化成位數(shù)據(jù)ByteToBit(K, Key
22、, 64);/通過(guò)PC-1置換選擇表進(jìn)行置換 Transform(K, K, PC1_Table, 56); /進(jìn)行16輪的迭代for(int i=0; i<16; +i) /對(duì)左部的28位進(jìn)行 左循環(huán) RotateL(KL, 28, LOOP_Tablei); /對(duì)右部的28位進(jìn)行 左循環(huán) RotateL(KR, 28, LOOP_Tablei); /根據(jù) PC-2置換選擇表進(jìn)行置換 Transform(*pSubKey)i, K, PC2_Table, 48); /進(jìn)行F函數(shù)運(yùn)算void F_func(bool In32, const bool Ki48) static bool M
23、R48; Transform(MR, In, E_Table, 48); Xor(MR, Ki, 48); S_func(In, MR); Transform(In, In, P_Table, 32);/進(jìn)行S函數(shù)運(yùn)算(S盒)void S_func(bool Out32, const bool In48) for(char i=0,j,k; i<8; +i,In+=6,Out+=4) j = (In0<<1) + In5; k = (In1<<3) + (In2<<2) + (In3<<1) + In4;ByteToBit(Out, &am
24、p;S_Boxijk, 4); /通過(guò)指定的置換表進(jìn)行數(shù)據(jù)置換void Transform(bool *Out, bool *In, const char *Table, int len) for(int i=0; i<len; +i) Tmpi = In Tablei-1 ; memcpy(Out, Tmp, len);/進(jìn)行異或運(yùn)算void Xor(bool *InA, const bool *InB, int len) for(int i=0; i<len; +i) InAi = InBi;/進(jìn)行循環(huán)左移運(yùn)算void RotateL(bool *In, int len, in
25、t loop) memcpy(Tmp, In, loop); /獲取In字符組的前l(fā)oop個(gè)字符 memcpy(In, In+loop, len-loop);/把In字符數(shù)組的后len-loop移到數(shù)組的開頭 memcpy(In+len-loop, Tmp, loop);/把loop個(gè)字符補(bǔ)到末尾/把字符轉(zhuǎn)化為位void ByteToBit(bool *Out, const char *In, int bits) for(int i=0; i<bits; +i) Outi = (Ini>>3>>(i&7) & 1;/通過(guò)移位獲取每一個(gè)字符的第一個(gè)位
26、的值/把位轉(zhuǎn)化為數(shù)組void BitToByte(char *Out, const bool *In, int bits) memset(Out, 0, bits>>3); for(int i=0; i<bits; +i) /沒八個(gè)位和并為一個(gè)字符 Outi>>3 |= Ini<<(i&7);int main()memset(key,0,sizeof(key); /把密匙空間清空并置為0FILE *openfile;int contextCount=0;char pn20,cn20;char chooser;int flag=1; while(
27、flag)memset(bufer, 0, sizeof(bufer); /把緩存區(qū)等清空并置為0memset(context,0,sizeof(context);/把內(nèi)容空間清空并置為0printf("請(qǐng)選擇下面的操作步驟 E 加密運(yùn)算 D解密運(yùn)算 X退出n");int keyCount=sizeof(key);scanf("%c",&chooser);getchar(); /接受回車符 switch(chooser)case 'E':case 'e': printf("請(qǐng)輸入要加密的文件的文件名:&q
28、uot;);scanf("%s",pn);getchar();printf("請(qǐng)輸入密鑰:");scanf("%s",key);getchar(); openfile=fopen(pn,"rb");/打開明文內(nèi)容 if(!openfile) printf("明文文件打開失??!n"); return 0; contextCount=fread(context,sizeof(char),1024,openfile);/獲取明文文件內(nèi)容并得到實(shí)際內(nèi)容的大小 printf("明文的大小為:%d
29、n明文的內(nèi)容為:n%snn",contextCount,context); fclose(openfile); openfile=0; strcpy(bufer,context); Des_Go(bufer,bufer,contextCount,key,keyCount,ENCRYPT); printf("加密后的內(nèi)容為:n%snn",bufer); printf("是否保存到文件中(Y,N):"); char c; scanf("%c",&c); getchar(); if(c='y'|c='
30、;Y') printf("請(qǐng)輸入文件名:"); memset(cn,NULL,sizeof(cn); scanf("%s",cn); getchar(); savefile(bufer,'E',cn); printf("n");break;case 'D':case 'd': printf("請(qǐng)輸入要解密的文件的文件名:");scanf("%s",cn);getchar();printf("請(qǐng)輸入密鑰:");scanf(
31、"%s",key);getchar(); openfile=fopen(cn,"rb");/打開密文內(nèi)容if(!openfile) printf("密文文件打開失敗!n"); return 0; contextCount=fread(context,sizeof(char),1024,openfile);/獲取明文文件內(nèi)容并得到實(shí)際內(nèi)容的大小 printf("密文的大小為:%dn密文的內(nèi)容為:n%snn",contextCount,context); fclose(openfile); openfile=0; st
32、rcpy(bufer,context); Des_Go(bufer,bufer,contextCount,key,keyCount,DECRYPT); printf("解密后的內(nèi)容為:n%snn",bufer); printf("是否保存到文件中(Y,N):"); char c; scanf("%c",&c); getchar(); if(c='y'|c='Y') printf("請(qǐng)輸入文件名:"); memset(pn,NULL,sizeof(pn); scanf(&quo
33、t;%s",pn); getchar(); savefile(bufer,'D',pn); printf("n"); break;case 'X':case 'x':flag=0; return 1;void savefile(const char* s,char c,char *fn) FILE *f; if(c='E') f=fopen(fn,"wb");if(!f) printf("打開文件失??!n"); return; if(fwrite(s,sizeo
34、f(char),strlen(s),f)!=strlen(s) printf("寫入文件失?。"); printf("寫入文件成功!n") ; else f=fopen(fn,"wb");if(!f) printf("打開文件失??!n"); return; if(fwrite(s,sizeof(char),strlen(s),f)!=strlen(s) printf("寫入文件失敗!n"); printf("寫入文件成功!n") ; fclose(f);Des.h:/*定義
35、了一個(gè)枚舉變量 ENCRYPT=0 表示加密DECRYPT=1表示解密*/enum ENCRYPT,DECRYPT;/* TypeENCRYPT:加密,DECRYPT:解密 輸出緩沖區(qū)(Out)的長(zhǎng)度 >= (datalen+7)/8)*8,即比datalen大的且是8的倍數(shù)的最小正整數(shù) In 可以= Out,此時(shí)加/解密后將覆蓋輸入緩沖區(qū)(In)的內(nèi)容 當(dāng)keylen>8時(shí)系統(tǒng)自動(dòng)使用3次DES加/解密,否則使用標(biāo)準(zhǔn)DES加/解密.超過(guò)16字節(jié)后只取前16字節(jié) In 是輸入的字符組 可能是明文也可能是密文,Key是密匙,keylen是密匙的長(zhǎng)度,Type表示解密或加密 */boo
36、l 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)一起提出的。當(dāng)時(shí)他們?nèi)硕荚诼槭±砉W(xué)院工作。RSA就是他們?nèi)诵帐祥_頭字母拼在一起組成的。RSA是目前最有影響力的,它能夠抵抗到目前為止已知的絕大多數(shù)密碼攻擊,已被ISO推薦為公鑰。今天只有短的RSA鑰匙才可能被強(qiáng)力方式解破。到2008年為止,世界上還沒有任何可靠的攻擊RSA算法的方式。只要其鑰匙
37、的長(zhǎng)度足夠長(zhǎng),用RSA加密的信息實(shí)際上是不能被解破的。但在和理論日趨成熟的今天,RSA加密安全性受到了挑戰(zhàn)。RSA算法基于一個(gè)十分簡(jiǎn)單的數(shù)論事實(shí):將兩個(gè)大素?cái)?shù)相乘十分容易,但是想要對(duì)其乘積進(jìn)行因式分解卻極其困難,因此可以將乘積公開作為加密密鑰。在中,加密密鑰(即公開密鑰)PK是公開信息,而解密密鑰(即秘密密鑰)SK是需要保密的。E和解密算法D也都是公開的。雖然秘密密鑰SK是由公開密鑰PK決定的,但卻不能根據(jù)PK計(jì)算出SK。RSA算法是第一個(gè)能同時(shí)用于加密和的算法,也易于理解和操作。RSA是被研究得最廣泛的算法,從提出到現(xiàn)今的三十多年里,經(jīng)歷了各種攻擊的考驗(yàn),逐漸為人們接受,普遍認(rèn)為是目前最優(yōu)秀
38、的公鑰方案之一。RSA算法實(shí)現(xiàn)過(guò)程:RSA算法實(shí)現(xiàn)細(xì)節(jié):密鑰生成首先要使用概率算法來(lái)驗(yàn)證隨機(jī)產(chǎn)生的大的整數(shù)是否質(zhì)數(shù),這樣的算法比較快而且可以消除掉大多數(shù)非質(zhì)數(shù)。假如有一個(gè)數(shù)通過(guò)了這個(gè)測(cè)試的話,那么要使用一個(gè)精確的測(cè)試來(lái)保證它的確是一個(gè)質(zhì)數(shù)。除此之外這樣找到的p和q還要滿足一定的要求,首先它們不能太靠近,此外p-1或q-1的因子不能太小,否則的話N也可以被很快地分解。此外尋找質(zhì)數(shù)的算法不能給攻擊者任何信息,這些質(zhì)數(shù)是怎樣找到的,尤其產(chǎn)生隨機(jī)數(shù)的軟件必須非常好。要求是隨機(jī)和不可預(yù)測(cè)。這兩個(gè)要求并不相同。一個(gè)隨機(jī)過(guò)程可能可以產(chǎn)生一個(gè)不相關(guān)的數(shù)的系列,但假如有人能夠預(yù)測(cè)出(或部分地預(yù)測(cè)出)這個(gè)系列的話
39、,那么它就已經(jīng)不可靠了。比如有一些非常好的隨機(jī)數(shù)算法,但它們都已經(jīng)被發(fā)表,因此它們不能被使用,因?yàn)榧偃缫粋€(gè)攻擊者可以猜出p和q一半的位的話,那么他們就已經(jīng)可以輕而易舉地推算出另一半。此外密鑰d必須足夠大,1990年有人證明假如p大于q而小于2q(這是一個(gè)很經(jīng)常的情況)而,那么從N和e可以很有效地推算出d。此外e = 2永遠(yuǎn)不應(yīng)該被使用。速度比起DES和其它對(duì)稱算法來(lái)說(shuō),RSA要慢得多。實(shí)際上Bob一般使用一種對(duì)稱算法來(lái)加密他的信息,然后用RSA來(lái)加密他的比較短的對(duì)稱密碼,然后將用RSA加密的對(duì)稱密碼和用對(duì)稱算法加密的消息送給Alice。這樣一來(lái)對(duì)隨機(jī)數(shù)的要求就更高了,尤其對(duì)產(chǎn)生對(duì)稱密碼的要求非
40、常高,因?yàn)榉駝t的話可以越過(guò)RSA來(lái)直接攻擊對(duì)稱密碼。密鑰分配和其它加密過(guò)程一樣,對(duì)RSA來(lái)說(shuō)分配公鑰的過(guò)程是非常重要的。分配公鑰的過(guò)程必須能夠抵擋一個(gè)從中取代的攻擊。假設(shè)Eve交給Bob一個(gè)公鑰,并使Bob相信這是Alice的公鑰,并且她可以截下Alice和Bob之間的信息傳遞,那么她可以將她自己的公鑰傳給Bob,Bob以為這是Alice的公鑰。Eve可以將所有Bob傳遞給Alice的消息截下來(lái),將這個(gè)消息用她自己的密鑰解密,讀這個(gè)消息,然后將這個(gè)消息再用Alice的公鑰加密后傳給Alice。理論上Alice和Bob都不會(huì)發(fā)現(xiàn)Eve在偷聽他們的消息。今天人們一般用數(shù)字認(rèn)證來(lái)防止這樣的攻擊。時(shí)間
41、攻擊1995年有人提出了一種非常意想不到的攻擊方式:假如Eve對(duì)Alice的硬件有充分的了解,而且知道它對(duì)一些特定的消息加密時(shí)所需要的時(shí)間的話,那么她可以很快地推導(dǎo)出d。這種攻擊方式之所以會(huì)成立,主要是因?yàn)樵谶M(jìn)行加密時(shí)所進(jìn)行的模指數(shù)運(yùn)算是一個(gè)位元一個(gè)位元進(jìn)行的而位元為1所花的運(yùn)算比位元為0的運(yùn)算要多很多,因此若能得到多組訊息與其加密時(shí)間,就會(huì)有機(jī)會(huì)可以反推出私鑰的內(nèi)容。RSA用到的公式和定理一、數(shù)和互為素?cái)?shù)任何大于1的整數(shù)a能被因式分解為如下唯一形式:a=p1p2pl(p1,p2,pl為素?cái)?shù))二、模運(yùn)算a(mod n)×b(mod n)modn(a×b)(mod n)如果(
42、a×b)=(a×c)(mod n),a與n互素,則b=c(mod n)三、費(fèi)馬定理若p是素?cái)?shù),a與p互素,則a(p-1)1 (mod p)四、歐拉定理歐拉函數(shù)(n)表示不大于n且與n互素的正整數(shù)的個(gè)數(shù)。當(dāng)n是素?cái)?shù),(n)=n-1。n=pq,p,q均為素?cái)?shù)時(shí),則(n)= (p)(q)=(p-1)(q-1)。對(duì)于互素的a和n,有a(n)1(mod n)代碼段:#include<iostream>#include<cmath>#include"time.h"using namespace std;#define VLONG unsign
43、ed longVLONG prime_a;VLONG prime_b;VLONG n;VLONG PHI;VLONG e=2;VLONG d=0;VLONG gcd_number=1; /最大公約數(shù)VLONG m;VLONG C;VLONG D;/最大公約數(shù)VLONG gcd(VLONG n1, VLONG n2)if (n1<=0 | n2<=0) return 0;int t;if (n1<n2)A:if (n2%n1=0)return n1;elsefor (int i=2;i<=n1/2;i+)while (n1%i=0 && n2%i=0)gc
44、d_number=gcd_number*i;n1=n1/i;n2=n2/i;if (n1<2*i)break;else t=n1;n1=n2;n2=t;goto A;/在計(jì)算最大公約數(shù)時(shí)候假設(shè)n1n2,然后用迭代法計(jì)算出最大公約數(shù),若不符合n1n2的情況,交換n1和n2的值然后采取上述方法。return gcd_number;/質(zhì)數(shù)輸入檢測(cè)bool input_prime(int k)VLONG a;cin>>a;for (int i=2;i<=a/2;i+)if (a%i=0)return true;if (k=1)prime_a=a;else prime_b=a;r
45、eturn false;/輸入一個(gè)數(shù),若它為質(zhì)數(shù)則采用,若它不為質(zhì)數(shù)則需重新輸入一個(gè)數(shù),直到輸入的為質(zhì)數(shù)才會(huì)被采用。/取Evoid getE()srand(time(0); B:e = 1+rand()%PHI;while(e%2=0)e=e/2;while (gcd(e,PHI)!=1)e=e+2;if (e>=PHI | e=1)goto B;cout<<"e= "<<e<<" " /*while (gcd(e,PHI)!=1) /置隨機(jī)數(shù)種子。e = 1+rand()%PHI;cout<<&qu
46、ot;e= "<<e<<endl;*/* 密鑰庫(kù) */void getD()for (int i=0;i<10;i+)PHI=PHI*PHI; / 循環(huán)保安全while ( (PHI*PHI) % e !=1)PHI=PHI*PHI;d = PHI/e;cout<<"d= "<<d<<" "void getEE()VLONG great=0;while (gcd(e,PHI)!=1)e=e+1;cout<<"e= "<<e<<" "/求u mod m的逆元素算法,快速計(jì)算:gcdu,m=au+bm=1,p136(替換getD)void
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 雙方合伙買房合同范本
- 貨場(chǎng)散貨租賃合同范本2024年
- 高一語(yǔ)文開學(xué)第一課-課件-(共22張)
- 公路養(yǎng)護(hù)管理承包合同
- 2024企業(yè)資產(chǎn)收購(gòu)協(xié)議范本
- 宅基地使用權(quán)交易合同
- 2024年離婚孩子撫養(yǎng)補(bǔ)充協(xié)議范本
- 旅游開發(fā)合同書范本模板
- 2024年化糞池污水處理合同范本
- 小學(xué)教育資源共享協(xié)議
- 河南師范大學(xué)《解析幾何》2021-2022學(xué)年第一學(xué)期期末試卷
- 2024-2030年聽力保護(hù)耳塞行業(yè)市場(chǎng)現(xiàn)狀供需分析及投資評(píng)估規(guī)劃分析研究報(bào)告
- 2024年中國(guó)智慧養(yǎng)老行業(yè)市場(chǎng)現(xiàn)狀、發(fā)展概況、未來(lái)前景分析報(bào)告
- 少兒美術(shù)課件國(guó)家寶藏系列《鳳冠》
- 天翼云從業(yè)者認(rèn)證考試題庫(kù)及答案
- 旅游景區(qū)的提升規(guī)劃方案
- 國(guó)家能源集團(tuán)國(guó)神公司招聘筆試題庫(kù)2024
- 揚(yáng)州樹人學(xué)校2024-2025七年級(jí)上學(xué)期9月月考數(shù)學(xué)試卷及答案
- 課件:七年級(jí)道德與法治上冊(cè)(統(tǒng)編版2024)-【新教材解讀】義務(wù)教育教材內(nèi)容解讀課件
- 002醫(yī)療器械質(zhì)量安全關(guān)鍵崗位人員崗位說(shuō)明
- 2024-2030年中國(guó)木制品行業(yè)市場(chǎng)深度發(fā)展趨勢(shì)與前景展望戰(zhàn)略分析報(bào)告
評(píng)論
0/150
提交評(píng)論