日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

转载并学习实现三重DES加密解密代码(一)

發(fā)布時(shí)間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 转载并学习实现三重DES加密解密代码(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

作者:finallyliuyu 出處:博客園

聲明:此篇博文代碼來自于鄒德強(qiáng)先生。由于目前找到的版本是殘缺版,所以我又進(jìn)行了補(bǔ)全。讀一份好代碼,可以領(lǐng)略到作者的編程風(fēng)格和語言駕馭能力,同時(shí)又能從其中汲取養(yǎng)分。現(xiàn)將我所修改后的DES加密解密代碼全部張貼出來,有需要的也可以在上面繼續(xù)改動(dòng)

comon.h

?

#ifndef?_COMMON_H
#define?_COMMON_H
typedef?
bool?(*?PSubKey)[16][48];
#endif myDES.h #ifndef?_myDES_H
#define?_myDES_H
#include?
"common.h"
#include
<stdio.h>
class?myDES
{
public:
????myDES();
????
~myDES();
?????
void?ByteToBit(bool?*Out,?const?char?*In,?int?bits);
?????
void?BitToByte(char?*Out,?const?bool?*In,?int?bits);
?????
void?RotateL(bool?*In,?int?len,?int?loop);
?????
void?RotateR(bool?*In,int?len,int?loop);
?????
void?Xor(bool?*InA,?const?bool?*InB,?int?len);
?????
void?Transform(bool?*Out,?bool?*In,?const?char?*Table,?int?len);
?????
void?S_func(bool?Out[32],?const?bool?In[48]);
?????
void?F_func(bool?In[32],?const?bool?Ki[48]);
?????
bool?RunDes(bool?bType,char*?In,char*?Out,unsigned?datalen,const?char*?Key,const?unsigned?char?keylen);
?????
bool?RunPad(int?nType,const?char*?In,unsigned?datalen,char*?Out,unsigned&?padlen);
?????
void?SetSubKey(PSubKey?pSubKey,?const?char?Key[8]);
?????
void?DES(char?Out[8],?char?In[8],?const?PSubKey?pSubKey,bool?nType);
?????
bool?myRunDES(bool?bType,char*?In,char*?Out,unsigned?datalen,const?char*?Key,const?unsigned?char?keylen);







????
};
#endif

?

?

?

?

?

?

myDES.cpp //?DES.cpp:?implementation?of?the?myDES?class.
//
//
#include?"myDES.h"
#include?
"memory.h"



//?initial?permutation?IP
const?char?IP_Table[64]?=?{
????
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
};
//?final?permutation?IP^-1?
const?char?IPR_Table[64]?=?{
????
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
};
//?expansion?operation?matrix
const?char?E_Table[48]?=?{
????
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-bit?permutation?function?P?used?on?the?output?of?the?S-boxes?
const?char?P_Table[32]?=?{
????
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
};
//?permuted?choice?table?(key)?
const?char?PC1_Table[56]?=?{
????
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
};
//?permuted?choice?key?(table)?
const?char?PC2_Table[48]?=?{
????
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
};
//?number?left?rotations?of?pc1?
const?char?LOOP_Table[16]?=?{
????
1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
};
const?char?LOOPR_Table[16]={1,2,2,2,2,2,2,1,2,2,2,2,2,2,1,0};
//?The?(in)famous?S-boxes?
const?char?S_Box[8][4][16]?=?{
????
//?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
};


myDES::myDES()
{
????
}

myDES::
~myDES()
{
}

/*******************************************************************/
/*
??函?數(shù)?名?稱:????ByteToBit
??功?能?描?述:????把BYTE轉(zhuǎn)化為Bit流
??參?數(shù)?說?明:????Out:????輸出的Bit流[in][out]
????????????????In:????????輸入的BYTE流[in]
????????????????bits:????Bit流的長度[in]

??返回值?說明:????void
??作???????者:????鄒德強(qiáng)
??更?新?日?期:????2003.12.19
/******************************************************************
*/
void?myDES::ByteToBit(bool?*Out,?const?char?*In,?int?bits)
{
????
for(int?i=0;?i<bits;?++i)
????????Out[i]?
=?(In[i>>3]>>(7?-?i&7))?&?1;
}

/*******************************************************************/
/*
??函?數(shù)?名?稱:????BitToByte
??功?能?描?述:????把Bit轉(zhuǎn)化為Byte流
??參?數(shù)?說?明:????Out:????輸出的BYTE流[in][out]
????????????????In:????????輸入的Bit流[in]
????????????????bits:????Bit流的長度[in]

??返回值?說明:????void
??作???????者:????鄒德強(qiáng)
??更?新?日?期:????2003.12.19
/******************************************************************
*/
?
void?myDES::?BitToByte(char?*Out,?const?bool?*In,?int?bits)
{
????memset(Out,?
0,?bits>>3);
????
for(int?i=0;?i<bits;?++i)
????????Out[i
>>3]?|=?In[i]<<(7?-?i&7);
}



/*******************************************************************/
/*
??函?數(shù)?名?稱:????RotateL
??功?能?描?述:????把BIT流按位向左迭代
??參?數(shù)?說?明:????In:????????輸入的Bit流[in]
????????????????len:????Bit流的長度[in]
????????????????loop:????向左迭代的長度

??返回值?說明:????void
??作???????者:????鄒德強(qiáng)
??更?新?日?期:????2003.12.19
/******************************************************************
*/
?
void?myDES::RotateL(bool?*In,?int?len,?int?loop)
{
????
bool?Tmp[256];

????memcpy(Tmp,?In,?loop);
????memcpy(In,?In
+loop,?len-loop);
????memcpy(In
+len-loop,?Tmp,?loop);
}
?
?
void?myDES::RotateR(bool?*In,int?len,int?loop)
?{
?????
bool?Tmp[256];
?????memcpy(Tmp,In,len
-loop);
?????memcpy(In,In
+len-loop,loop);
?????memcpy(In
+len-loop,Tmp,len-loop);

?}



/*******************************************************************/
/*
??函?數(shù)?名?稱:????Xor
??功?能?描?述:????把兩個(gè)Bit流進(jìn)行異或
??參?數(shù)?說?明:????InA:????輸入的Bit流[in][out]
????????????????InB:????輸入的Bit流[in]
????????????????loop:????Bit流的長度

??返回值?說明:????void
??作???????者:????鄒德強(qiáng)
??更?新?日?期:????2003.12.19
/******************************************************************
*/
?
void?myDES::Xor(bool?*InA,?const?bool?*InB,?int?len)
{
????
for(int?i=0;?i<len;?++i)
????????InA[i]?
^=?InB[i];
}


/*******************************************************************/
/*
??函?數(shù)?名?稱:????Transform
??功?能?描?述:????把兩個(gè)Bit流按表進(jìn)行位轉(zhuǎn)化
??參?數(shù)?說?明:????Out:????輸出的Bit流[out]
????????????????In:????????輸入的Bit流[in]
????????????????Table:????轉(zhuǎn)化需要的表指針
????????????????len:????轉(zhuǎn)化表的長度

??返回值?說明:????void
??作???????者:????鄒德強(qiáng)
??更?新?日?期:????2003.12.19
/******************************************************************
*/
?
void?myDES::Transform(bool?*Out,?bool?*In,?const?char?*Table,?int?len)
{
????
bool?Tmp[256];

????
for(int?i=0;?i<len;?++i)
????????Tmp[i]?
=?In[?Table[i]-1?];
????memcpy(Out,?Tmp,?len);
}



/*******************************************************************/
/*
??函?數(shù)?名?稱:????S_func
??功?能?描?述:????實(shí)現(xiàn)數(shù)據(jù)加密S?BOX模塊
??參?數(shù)?說?明:????Out:????輸出的32Bit[out]
????????????????In:????????輸入的48Bit[in]

??返回值?說明:????void
??作???????者:????鄒德強(qiáng)
??更?新?日?期:????2003.12.19
/******************************************************************
*/
?
void?myDES::S_func(bool?Out[32],?const?bool?In[48])
{
????
for(char?i=0,j,k;?i<8;?++i,In+=6,Out+=4)?
????{
????????j?
=?(In[0]<<1)?+?In[5];
????????k?
=?(In[1]<<3)?+?(In[2]<<2)?+?(In[3]<<1)?+?In[4];????//組織SID下標(biāo)
????????
????????
for(int?l=0;?l<4;?++l)????????????????????????????????//把相應(yīng)4bit賦值
????????????Out[l]?=?(S_Box[i][j][k]>>(3?-?l))?&?1;
????}
}


/*******************************************************************/
/*
??函?數(shù)?名?稱:????F_func
??功?能?描?述:????實(shí)現(xiàn)數(shù)據(jù)加密到輸出P
??參?數(shù)?說?明:????Out:????輸出的32Bit[out]
????????????????In:????????輸入的48Bit[in]

??返回值?說明:????void
??作???????者:????鄒德強(qiáng)
??更?新?日?期:????2003.12.19
/******************************************************************
*/
?
void?myDES::F_func(bool?In[32],?const?bool?Ki[48])
{
????
bool?MR[48];
????Transform(MR,?In,?E_Table,?
48);
????Xor(MR,?Ki,?
48);
????S_func(In,?MR);
????Transform(In,?In,?P_Table,?
32);
}


/*******************************************************************/
/*
??函?數(shù)?名?稱:????RunDes
??功?能?描?述:????執(zhí)行DES算法對(duì)文本加解密
??參?數(shù)?說?明:????bType????:類型:加密ENCRYPT,解密DECRYPT
????????????????bMode????:模式:ECB,CBC
????????????????In????????:待加密串指針
????????????????Out????????:待輸出串指針
????????????????datalen????:待加密串的長度,同時(shí)Out的緩沖區(qū)大小應(yīng)大于或者等于datalen
????????????????Key????????:密鑰(可為8位,16位,24位)支持3密鑰
????????????????keylen????:密鑰長度,多出24位部分將被自動(dòng)裁減

??返回值?說明:????bool????:是否加密成功
??作???????者:????鄒德強(qiáng)
??更?新?日?期:????2003.12.19
/******************************************************************
*/
bool?myDES::RunDes(bool?bType,char*?In,char*?Out,unsigned?datalen,const?char*?Key,const?unsigned?char?keylen)
{
????
//判斷輸入合法性
????if(!(In?&&?Out?&&?Key?&&?datalen?&&?keylen>=8))
????????
return?false;
????
//只處理8的整數(shù)倍,不足長度自己填充
????if(datalen?&?0x00000007)
????????
return?false;
????
????
bool????????????????m_SubKey[3][16][48];????????//秘鑰
????
//構(gòu)造并生成SubKeys
????unsigned?char?nKey????=????(keylen>>3)>3???3:?(keylen>>3);
????
for(int?i=0;i<nKey;i++)
????{
????????SetSubKey(
&m_SubKey[i],&Key[i<<3]);
????}

????????
//ECB模式
????
????????
if(nKey????==????1)????//單Key
????????{
????????????
for(int?i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
????????????{
????????????????DES(Out,In,
&m_SubKey[0],bType);
????????????}
????????}
????????
else
????????
if(nKey?==?2)????//3DES?2Key
????????{
????????????
for(int?i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
????????????{
????????????????DES(Out,In,
&m_SubKey[0],bType);
????????????????DES(Out,Out,
&m_SubKey[1],!bType);
????????????????DES(Out,Out,
&m_SubKey[0],bType);
????????????}
????????}
????????
else????????????//3DES?3Key
????????{
????????????
for(int?i=0,j=datalen>>3;i<j;++i,Out+=8,In+=8)
????????????{
????????????????DES(Out,In,
&m_SubKey[bType??2?:?0],bType);
????????????????DES(Out,Out,
&m_SubKey[1],!bType);
????????????????DES(Out,Out,
&m_SubKey[bType??0?:?2],bType);????
????????????}
????????}
????????
????
????
????
return?true;
}




/*******************************************************************/
/*
??函?數(shù)?名?稱:????RunPad
??功?能?描?述:????根據(jù)協(xié)議對(duì)加密前的數(shù)據(jù)進(jìn)行填充
??參?數(shù)?說?明:????bType????:類型:PAD類型
????????????????In????????:數(shù)據(jù)串指針
????????????????Out????????:填充輸出串指針
????????????????datalen????:數(shù)據(jù)的長度
????????????????padlen????:(in,out)輸出buffer的長度,填充后的長度

??返回值?說明:????bool????:是否填充成功
??作???????者:????鄒德強(qiáng)
??修?改?歷?史:????

??更?新?日?期:????2003.12.19
/******************************************************************
*/
/*bool????myDES::RunPad(int?nType,const?char*?In,unsigned?datalen,char*?Out,unsigned&?padlen)
{
????int?res?=?(datalen?&?0x00000007);
????
????
????if(padlen<?(datalen+8-res))
????{
????????return?false;
????}
????else
????{
????????padlen????=????(datalen+8-res);
????????memcpy(Out,In,datalen);
????????if(nType==PAD_ISO_1)
????????{
????????????memset(Out+datalen,0x00,8-res);
????????}

????????else?if(nType==PAD_ISO_2)
????????{
????????????memset(Out+datalen,0x80,1);
????????????memset(Out+datalen,0x00,7-res);
????????}
????????else?if(nType==PAD_PKCS_7)
????????{
????????????memset(Out+datalen,8-res,8-res);
????????}
????????else
????????{
????????????return?false;
????????}

????????return?true;
????}
????
????
????
}
*/
bool????myDES::RunPad(int?nType,const?char*?In,unsigned?datalen,char*?Out,unsigned&?padlen)
{
????
int?res?=?(datalen?&?0x00000007);
????memcpy(Out,In,datalen);
????
if?(res)
????{
????????memset(Out
+datalen,0x00,8-res);
????????
return?true;

????}
????
else
????{
????????
return?false;
????}


????

????????????
}






//計(jì)算并填充子密鑰到SubKey數(shù)據(jù)中
void?myDES::SetSubKey(PSubKey?pSubKey,?const?char?Key[8])
{
????
bool?K[64],?*KL=&K[0],?*KR=&K[28];
????ByteToBit(K,?Key,?
64);
????Transform(K,?K,?PC1_Table,?
56);
????
for(int?i=0;?i<16;?++i)?
????{
????????
????????
????????????RotateL(KL,?
28,?LOOP_Table[i]);
????????????RotateL(KR,?
28,?LOOP_Table[i]);????
???????????Transform((
*pSubKey)[i],?K,?PC2_Table,?48);
????}
}



//DES單元運(yùn)算
void?myDES::DES(char?Out[8],?char?In[8],?const?PSubKey?pSubKey,bool?nType)
{
????
bool?M[64],?tmp[32],?*Li=&M[0],?*Ri=&M[32];
????ByteToBit(M,?In,?
64);
????Transform(M,?M,?IP_Table,?
64);
????
if(?nType?)
????{
????????
for(int?i=0;?i<16;?++i)
????????{
????????????memcpy(tmp,?Ri,?
32);????????//Ri[i-1]?保存
????????????F_func(Ri,?(*pSubKey)[i]);????//Ri[i-1]經(jīng)過轉(zhuǎn)化和SBox輸出為P
????????????Xor(Ri,?Li,?32);????????????//Ri[i]?=?P?XOR?Li[i-1]
????????????memcpy(Li,?tmp,?32);????????//Li[i]?=?Ri[i-1]
????????}
????}
????
else
????{
????????
for(int?i=15;?i>=0;?--i)?
????????{
????????????memcpy(tmp,?Ri,?
32);????????//Ri[i-1]?保存
????????????F_func(Ri,?(*pSubKey)[i]);????//Ri[i-1]經(jīng)過轉(zhuǎn)化和SBox輸出為P
????????????Xor(Ri,?Li,?32);????????????//Ri[i]?=?P?XOR?Li[i-1]
????????????memcpy(Li,?tmp,?32);????????//Li[i]?=?Ri[i-1]
????????}
????}
????RotateL(M,
64,32);????????????????????//Ri與Li換位重組M
????Transform(M,?M,?IPR_Table,?64);????????//最后結(jié)果進(jìn)行轉(zhuǎn)化
????BitToByte(Out,?M,?64);????????????????//組織成字符
}
bool?myDES::myRunDES(bool?bType,char*?In,char*?Out,unsigned?datalen,const?char*?Key,const?unsigned?char?keylen)
{


????
return?true;
????
}

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/finallyliuyu/archive/2010/12/27/1917600.html

總結(jié)

以上是生活随笔為你收集整理的转载并学习实现三重DES加密解密代码(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。