加密解密算法的C++實現(xiàn)_第1頁
加密解密算法的C++實現(xiàn)_第2頁
加密解密算法的C++實現(xiàn)_第3頁
加密解密算法的C++實現(xiàn)_第4頁
加密解密算法的C++實現(xiàn)_第5頁
已閱讀5頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、網(wǎng)絡(luò)與信息安全Introduction to Network and SecurityDES 加密解密算法的C+實現(xiàn)2011年10月目錄一、DES算法的概述31、DES簡介32、DES算法原理33、DES算法簡述43.1算法過程的具體分析53.2 具體示例分析8二、DES算法的C+實現(xiàn)91、運行環(huán)境92、功能說明93、程序函數(shù)說明94、程序運行效果圖20三、小結(jié)22一、DES算法的概述1、DES簡介DES是Data Encryption Standard(數(shù)據(jù)加密標(biāo)準(zhǔn))的縮寫。1974年,IBM向NBS提交了由Tuchman博士領(lǐng)導(dǎo)的小組設(shè)計并經(jīng)改造的Luciffer算法。NSA(美國國家安全

2、局)組織專家對該算法進行了鑒定,使其成為DES的基礎(chǔ)。1975年NBS公布了這個算法,并說明要以它作為聯(lián)邦信息加密標(biāo)準(zhǔn),征求各方意見。1976年,DES被采納作為聯(lián)邦標(biāo)準(zhǔn),并授權(quán)在非機密的政府通信中使用。DES在銀行,金融界嶄露頭角,隨后得到廣泛應(yīng)用。幾十年過去了,雖然DES已不再作為數(shù)據(jù)加密標(biāo)準(zhǔn),但它仍然值得研究和學(xué)習(xí)。首先三重算法仍在Internet中廣泛使用,如PGP和S/MIME中都使用了三重DES作為加密算法。其次,DES是歷史上最為成功的一種分組密碼算法,它的使用時間之長,范圍之大,是其它分組密碼算法不能企及的,而DES的成功則歸因于其精巧的設(shè)計和結(jié)構(gòu)。2、DES算法原理DES是一

3、個對稱分組密碼,它使用56位密鑰操作64位分組。DES以64位分組形式加密數(shù)據(jù)。算法的輸入是64位分組的明文,算法的輸出是64位分組的密文,明文到密文經(jīng)過了16輪一致的運算。通過剔除8個奇偶校驗位,即忽略給定64位密鑰中的每一個第8位,從而得到密鑰長度為56位。與其他分組加密方案一樣,加密函數(shù)使用了兩個輸入:要被加密的64位明文和56位密鑰。DES的基本構(gòu)建是對明文分組的進行置換和替換的適宜組合(16次)。通過S-盒查表完成替換。除了以相反次序處理密鑰次序表之外,加密和解密使用了相同的算法。明文分組X組首先按初始置換IP表進行置換,得到Xo=IP(X)=(Lo,Ro)。經(jīng)過16輪的置換、XOR

4、和替換之后,反向置換IP-1生成密文分組。如果使用Xi=(Li,Ri)表示第i輪加密結(jié)果,那么有:Li=Ri-1Ri=Li-1 f(Ri-1,Ki)DES的第i輪加密如圖2-1所示。從加密公式中能夠?qū)С鋈缦碌慕饷苓^程:Ri-1=LiLi-1=Ri f(Ri-1,Ki)= Rif(Li,Ki)Ri-11Li-1f(Ri-1,Ki)KiLiRi圖2-1 DES算法的第i輪過程3、DES算法簡述 DES算法處理的數(shù)據(jù)對象是一組64比特的明文串。設(shè)該明文串為m=m1m2m64 (mi=0或1)。明文串經(jīng)過64比特的密鑰K來加密,最后生成長度為64比特的密文E。其加密算法過程如圖3-1所示下:圖3-1算

5、法加密流程圖3.1算法過程的具體分析IP置換對DES算法加密過程圖示的說明如下:待加密的64比特明文串m,經(jīng)過IP置換后,得到的比特串的下標(biāo)列表如表3-1下:該比特串被分為32位的Lo和32位的Ro兩部分。Ro子密鑰K1(子密鑰的生成將在后面講)經(jīng)過變換f(Ro,K1)(f變換將在下面講)輸出32位的比特串f1,f1與Lo做不進位的二進制加法運算。運算規(guī)則為:f1與Lo做不進位的二進制加法運算后的結(jié)果賦給R1,Ro則原封不動的賦給L1。L1與Ro又做與以上完全相同的運算,生成L2,R2 一共經(jīng)過16次運算。最后生成R16和L16。其中R16為L15與f(R15,K16)做不進位二進制加法運算的

6、結(jié)果,L16是R15的直接賦值。R16與L16合并成64位的比特串。值得注意的是R16一定要排在L16前面。R16與L16合并后成的比特串,經(jīng)過置換IP-1后所得比特串的下標(biāo)列表3-2如下:經(jīng)過置換IP-1后生成的比特串就是密文。變換f(Ri-1,Ki)的功能它的功能是將32比特的輸入再轉(zhuǎn)化為32比特的輸出。其過程如圖3-2所示:對f變換說明如下:輸入Ri-1(32比特)經(jīng)過變換E后,膨脹為48比特。膨脹后的比特串的下標(biāo)列表3-3如下:膨脹后的比特串分為8組,每組6比特。各組經(jīng)過各自的S盒后,又變?yōu)?比特(具體過程見后),合并后又成為32比特。該32比特經(jīng)過P變換后,其下標(biāo)列表3-4如下:經(jīng)過

7、P變換后輸出的比特串才是32比特的f (Ri-1,Ki)。S盒的變換過程任取一S盒。見圖3-3所示。在其輸入b1,b2,b3,b4,b5,b6中,計算出x=b1*2+b6, y=b5+b4*2+b3*4+b2*8,再從Si表中查出x 行,y 列的值Sxy。將Sxy化為二進制,即得Si盒的輸出。(S表如圖3-4所示)子密鑰的生成64比特的密鑰生成16個48比特的子密鑰。子密鑰生成過程具體解釋如下:64比特的密鑰K,經(jīng)過PC-1后,生成56比特的串。其下標(biāo)如表3-5所示:該比特串分為長度相等的比特串C0和D0。然后C0和D0分別循環(huán)左移1位,得到C1和D1。C1和D1合并起來生成C1D1。C1D1

8、經(jīng)過PC-2變換后即生成48比特的K1。K1的下標(biāo)列表3-6為:C1、D1分別循環(huán)左移LS2位,再合并,經(jīng)過PC-2,生成子密鑰K2依次類推直至生成子密鑰K16。注意:Lsi (I =1,2,.16)的數(shù)值是不同的。具體見下表:3.2 具體示例分析假設(shè)64位明文為X=3570e2f1ba4682c7,密鑰K=581fbc94d3a452ea,包括8個奇偶校驗位,前2輪的密鑰分別是K1=27a169e58dda和K2=da91ddd76748。出于演示的目的,這里的DES加密限制為僅僅使用的前兩輪情況。使用表3-4IP將明文X劃分為兩個分組(Lo,Ro),這樣,Lo=ae1ba189和Ro=dc

9、1f104。32位的Ro被擴展為48位E(Ro),這樣,E(Ro)=6f80fe8a17a9。通過E(Ro)與第一輪的密鑰K1進行XOR運算,得到密鑰依賴函數(shù)f1,這樣:f1=E(Ro) K1=4821976f9a73這個48位的f1首先被劃分為8個6位分組,之后供給8個Si盒。從S盒替換階段得到計算輸出結(jié)果為1=a1ec961c。利用表3-5,1的置換位置為P(1)=2吧536c。將P(1)與Lo作模2加,得到:R1=P(1) Lo=85baf2e5由此L1=Ro,因此L1=dc1f10f4?,F(xiàn)在考慮第二輪加密。借助表3-3擴展到R1,得到E(R1)=c0bdf57a570b。將E(R1)與

10、K2做XOR運算,得到:f2=E(R1) K2=1a2c28ade043S盒的替換操作得到32位輸出2,因此,2=1ebcebdf。使用表3-4,計算置換P(2),得到P(2)=5f3e39f7,因此,經(jīng)過兩輪計算后得到的右半部分輸出R2=P(2) L1=83212903第二輪計算后的左半部分輸出立刻可以得到:L2=R1=85baf2e5在這兩輪密碼系統(tǒng)中,R2與L2的拼接稱作預(yù)輸出分組。之后對于輸出分組應(yīng)用表3-7所示的反向置換,這樣,第二輪結(jié)束后DES算法的輸出就成為密文Y:Y=IP-1(R2|L2)=de0aea二、DES算法的C+實現(xiàn)1、運行環(huán)境本系統(tǒng)采用Microsoft Visua

11、l Studio 2005軟件作為開發(fā)工具2、功能說明用C+語言實現(xiàn)了DES算法的加密解密過程。對已輸入的明文和密鑰進行加密并輸出密文;對已輸入的密文和密鑰進行解密,并輸出明文。3、程序函數(shù)說明在本次設(shè)計中,具體講解DES加密和解密程序,并在程序中詳細對程序進行了分析, 以下是DES加密和解密程序設(shè)計的詳細過程以及分析說明。/*源文件:DES.cpp*/*本程序為本人實驗程序*/#include #include #include / 初始置換表const static char IP_Table64 = 58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 3

12、6, 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;上面程序主要定義了初始置換表IP_Table。初始置換在第一輪運算之前執(zhí)行。將常量IP_Table看作是一個表結(jié)構(gòu)。此表應(yīng)該從左向右讀。例如,初始置換把明文的第58位換到第1位的位置,把第50位換到第

13、2位的位置,把第42位換到第3位的位置。/ 逆初始置換表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,

14、 25;上面程序主要定義了逆初始置換表IPR_Table。逆初始置換是初始置換的逆過程。注意,DES在最后一輪后,左半部分和右半部分并未交換,而是R16和L16并在一起形成一個分組作為逆初始置換的輸入。其實交換左右兩部分并循環(huán)移動,仍將獲得完全相同的結(jié)果。但這樣做,能使該算法既能用作加密,又能用作解密。/ 擴展置換表static const char Extension_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, 2

15、1, 20, 21, 22, 23, 24, 25,24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1;上面程序主要定義了擴展置換表Extension_Table。擴展置換將數(shù)據(jù)的右半部分Ri從32bit擴展到了48bit,這個操作改變了位的次序,重復(fù)了某些位。這樣做有兩個方面的目的:一是產(chǎn)生了與密鑰同長度的數(shù)據(jù)一進行異或運算:二是提供了更長的結(jié)果,使得在替代運算時能進行壓縮。/ P盒置換表const static char P_Table32 = 16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18,

16、31, 10,2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25;上面程序主要定義了P盒置換表P_Table。P盒替代運算后的32bit輸出依照P盒進行置換。該置換把每個輸入位映射到輸出位,任一位不能被映射兩次,也不能省去。P盒置換表就給了每位移至的位置。例如,第21位移到了第4位處,同時第4位移到了第31位處。./ 密鑰置換表 const static char PCK_Table56 = 57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,10, 2, 59, 51, 43,

17、 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;/ 壓縮置換表 const static char PCC_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, 5

18、1, 45, 33, 48,44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32;/ 每輪移動的位數(shù) const static char LOOP_Table16 = 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1;上面程序主要定義了密鑰置換表PCK_Table,每輪移動的位數(shù)表LOOP_Table和壓縮置換表PCC_Table。由于開始時不考慮每個字節(jié)的第8位,因此DES的密鑰由64bit減至56bit,如密鑰置換表所示。每個字節(jié)第8位可作為奇校驗以確保密鑰不發(fā)生錯誤。在DES的每一輪中,從56bit密鑰產(chǎn)生不同的48bit子密鑰。子密

19、鑰產(chǎn)生過程是:首先,56bit密鑰被分為兩部分,每部分28bit。然后根據(jù)輪數(shù),這兩部分分別循環(huán)左移1位或2位。LOOP_Table給出了每輪移動了的位數(shù)。移動后,就從56bit中選出58bit。因為這個運算不僅置換看了每位的順序,同時也選擇子密鑰,所以被稱為壓縮置換。表PCC_Table提供了一組48bit的集,定義了壓縮置換方式。例如,處在第33位位置的那一位在輸出時移動了第35位的位置,而在第18位位置的那一位被省去了。/ S盒設(shè)計const static char S_Box8416 = / S盒1 14,4,13,1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9

20、, 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,/ S盒2 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,

21、 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,/ S盒3 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,

22、 2, 12,/ S盒4 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,/ S盒5 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,14, 11, 2, 12,

23、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,/ S盒6 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,

24、1, 13, 11, 6, 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13,/ S盒7 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,/ S盒8 13, 2,

25、 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;上面的程序主要定了s盒S-BOX.每個S盒是一個4行,16列的表。盒中是一個4bit 的數(shù),S盒中的6個輸入確定了其對應(yīng)的輸出在哪行哪列。typedef bool (*PSubKey

26、)1648;enum ENCRYPT,DECRYPT;static bool SubKey21648;/ 16圈子密鑰static bool Is3DES;/ 3次DES標(biāo)志static char Tmp256, deskey16;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è)置密鑰static void SetSubKey(PSubKey pSubKey, const char Ke

27、y8);/ 設(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 void RotateL(bool *In, int len, int loop);

28、/ 循環(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é)組/ TypeENCRYPT:加密,DECRYPT:解密/ 輸出緩沖區(qū)(Out)的長度 = (datalen+7)/8)*8,即比datalen大的且是8的倍數(shù)的最小整數(shù)/ In 可以= Out,此時加/解密后將覆蓋輸入緩沖區(qū)(In)的內(nèi)容/ 當(dāng)keylen8時系統(tǒng)自動使用3次DES加/解密,否則使用標(biāo)準(zhǔn)DES加

29、/解密.超過16字節(jié)后只取前16字節(jié)bool DES_Act(char *Out,char *In,long datalen,const char *Key,int keylen,bool Type = ENCRYPT);上面的函數(shù)主要聲明了DES算法所需的函數(shù)。為了是讀者有整體的理解,把這些函數(shù)羅列在次,下面具體講解函數(shù)的實現(xiàn)。/ 字節(jié)轉(zhuǎn)換函數(shù)void ByteToBit(bool *Out, const char *In, int bits) for(int i=0; i3(i&7) & 1;/ 比特轉(zhuǎn)換函數(shù)void BitToByte(char *Out, const bool *In,

30、 int bits) memset(Out, 0, bits3); for(int i=0; i3 |= Ini(i&7);上面的程序是實現(xiàn)字節(jié)組轉(zhuǎn)換成位組和位組轉(zhuǎn)換成字節(jié)組的功能函數(shù)。在大部分函數(shù)中都會使用這兩個函數(shù),因為轉(zhuǎn)換后才能進行相應(yīng)的算法操作。/ 變換函數(shù)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);/ 異或函數(shù)的實現(xiàn)void Xor(bool *InA, const bo

31、ol *InB, int len) for(int i=0; ilen; +i) InAi = InBi;/ 循環(huán)左移函數(shù)void RotateL(bool *In, int len, int loop) memcpy(Tmp, In, loop); memcpy(In, In+loop, len-loop); memcpy(In+len-loop, Tmp, loop);上面的程序?qū)崿F(xiàn)了變換函數(shù),異或函數(shù),循環(huán)左移函數(shù)。變換函數(shù)Transform功能是實現(xiàn)各個表中的位置變換,以實現(xiàn)打亂順序的作用。異或函數(shù)Xor的主要功能是將兩個數(shù)組InA和InB進行異或運算,結(jié)果輸出在數(shù)組InA中。循環(huán)左移

32、函數(shù)Rotatel功能是輸入的數(shù)組進行移位,參數(shù)In是輸入的數(shù)組,參數(shù)loop是移位的位數(shù),參數(shù)len是移位的長度。/ S函數(shù)的實現(xiàn)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); / F函數(shù)的實現(xiàn)void F_func(bool In32, const bool Ki48) static bool MR48; Trans

33、form(MR, In, Extension_Table, 48); Xor(MR, Ki, 48); S_func(In, MR); Transform(In, In, P_Table, 32);上面的程序主要實現(xiàn)了S盒替換函數(shù)和F函數(shù)。S盒替換函數(shù)功能是根據(jù)S盒的設(shè)計將48bit的輸入變?yōu)?2bit的輸出。參數(shù)In是輸入的48bit數(shù)組,參數(shù)Out是輸出的32bit數(shù)組。F函數(shù)是整個DES加密算法中最重要的部分。參數(shù)In是32bit的輸入,參數(shù)Ki是由初始密鑰導(dǎo)出的第i輪子密鑰,F(xiàn)函數(shù)輸出的32bit存在于In數(shù)組中。次函數(shù)的實現(xiàn)過程為,首先經(jīng)過一個擴展運算,然后進行S盒替換,再進行P盒置

34、換。其中,擴展運算和P盒置換的主要作用是增加算法的擴展效果。/ 設(shè)置子密鑰void SetSubKey(PSubKey pSubKey, const char Key8) static bool K64, *KL=&K0, *KR=&K28; ByteToBit(K, Key, 64); /轉(zhuǎn)換格式 Transform(K, K, PCK_Table, 56); / 由56位密鑰產(chǎn)生48位子密鑰 for(int i=0; i16?16:len);SetSubKey(&SubKey0, &deskey0);Is3DES = len8 ? (SetSubKey(&SubKey1, &deskey8

35、), true) : false;上面的程序主要實現(xiàn)了設(shè)置子密鑰函數(shù)和設(shè)置密鑰函數(shù)。設(shè)置子密鑰函數(shù)SetSubKey實現(xiàn)流程是:首先調(diào)用Transform函數(shù)根據(jù)密鑰置換表將DES的密鑰由64bit減至56bit,然后將56bit密鑰分成兩部分,每部分28bit。然后,根據(jù)輪數(shù)表,調(diào)用RotateL函數(shù)分別將兩部分密鑰循環(huán)左移1位或2位。最后根據(jù)壓縮置換進行變換位置和選擇子密鑰。設(shè)置密鑰函數(shù)SetKey功能是判斷輸入的密鑰是否大于16bit,如果大于16bit,則采用取3次DES加密。/ DES加解密函數(shù)void DES(char Out8, char In8, const PSubKey p

36、SubKey, bool Type) static bool M64, tmp32, *Li=&M0, *Ri=&M32; ByteToBit(M, In, 64); Transform(M, M, IP_Table, 64); if( Type = ENCRYPT ) 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);上面程序

37、實現(xiàn)了DES加解密函數(shù)的功能函數(shù)。程序流程是:首先調(diào)用Transform函數(shù)根據(jù)初始表進行位置變換。然后開始16輪的循環(huán)運算,每輪循環(huán)中,調(diào)用F函數(shù)進行加密或者解密。最后調(diào)用Transform根據(jù)逆初始置換進行位置變換,再進行組到字節(jié)組對的轉(zhuǎn)換,輸出的就是密文或者解密文了。/ DES加解密函數(shù)(可以對長明文分段加密)bool DES_Act(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);if( !Is3DES ) / 1次DESfor(long i=0,j=datalen3; i3; ij; +i,Out+=8,In+=8) DES(Out, In, &SubKey0, Type);DES(Out, Out, &SubKey1, !Type);DES(Out, Out, &SubKey0, Type);return

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論