des是對稱加密嗎
Ⅰ DES加密和解密的對稱性
#include <iostream>
#include <fstream>
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[] = { //zuizhonghuan
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 sbox[8][64] = { //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 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 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 key[16][48]={0},/*rekey[16][48],*/
char key_in[8];
void ByteToBit(bool *Out,char *In,int bits) //位元組到位的轉換
{
int i;
for(i=0;i<bits;i++)
Out[i]=(In[i/8]>>(i%8))&1;
}
void BitToByte(char *Out,bool *In,int bits) //位到位元組轉換
{
for(int i=0;i<bits/8;i++)
Out[i]=0;
for(i=0;i<bits;i++)
Out[i/8]|=In[i]<<(i%8); //"|="組合了位操作符和賦值操作符的功能
}
void Xor(bool *InA,const bool *InB,int len) //按位異或
{
for(int i=0;i<len;i++)
InA[i]^=InB[i];
}
void keyfc(char *In) //獲取密鑰函數
{
int i,j=0,mov,k;
bool key0[56],temp,keyin[64];
ByteToBit(keyin,In,64); //位元組到位的轉換
for(i=0;i<56;i++) //密鑰壓縮為56位
key0[i]=keyin[Keyrar[i]-1];
for(i=0;i<16;i++) //16輪密鑰產生
{
if(i==0||i==1||i==8||i==15)
mov=1;
else
mov=2;
for(k=0;k<mov;k++) //分左右兩塊循環左移
{
// for(int m=0;m<8;m++)
// {
// temp=key0[m*7];
// for(j=m*7;j<m*7+7;j++)
// key0[j]=key0[j+1];
// key0[m*7+6]=temp;
// }
temp=key0[0];
for(int m=0;m<27;m++)
key0[m]=key0[m+1];
key0[27]=temp;
temp=key0[28];
for(m=28;m<55;m++)
key0[m]=key0[m+1];
key0[55]=temp;
}
for(j=0;j<48;j++) //壓縮置換並儲存
key[i][j]=key0[rar[j]-1];
}
}
void DES(char Out[8],char In[8],bool MS)//加密核心程序,ms=0時加密,反之解密
{
bool MW[64],tmp[32],PMW[64]; //注意指針
bool kzmw[48],keytem[48],ss[32];
int hang,lie;
ByteToBit(PMW,In,64);
for(int j=0;j<64;j++)
{
MW[j]=PMW[ip[j]-1]; //初始置換
}
bool *Li=&MW[0],*Ri=&MW[32];
for(int i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1]; //注意指針
if(MS==0) //DES加密過程
{
for(int lun=0;lun<16;lun++)
{
for(i=0;i<32;i++)
ss[i]=Ri[i];
for(i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1]; //注意指針
for(i=0;i<48;i++)
keytem[i]=key[lun][i]; //輪密鑰
Xor(kzmw,keytem,48);
/*S盒置換*/
for(i=0;i<8;i++)
{
hang=kzmw[i*6]*2+kzmw[i*6+5];
lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];
tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;
tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;
}
for(int i=0;i<32;i++) //P置換
Ri[i]=tmp[Pzh[i]-1];
Xor(Ri,Li,32); //異或
for(i=0;i<32;i++) //交換左右明文
{
Li[i]=ss[i];
}
}
for(i=0;i<32;i++)
{
tmp[i]=Li[i];
Li[i]=Ri[i];
Ri[i]=tmp[i];
}
for(i=0;i<64;i++)
PMW[i]=MW[fp[i]-1];
BitToByte(Out,PMW,64); //位到位元組的轉換
}
else //DES解密過程
{
for(int lun=15;lun>=0;lun--)
{
for(i=0;i<32;i++)
ss[i]=Ri[i];
for(int i=0;i<48;i++) //右明文擴展置換
kzmw[i]=Ri[ei[i]-1]; //注意指針
for(i=0;i<48;i++)
keytem[i]=key[lun][i]; //輪密鑰
Xor(kzmw,keytem,48);
/*S盒置換*/
for(i=0;i<8;i++)
{
hang=kzmw[i*6]*2+kzmw[i*6+5];
lie =kzmw[i*6+1]*8+kzmw[i*6+2]*4+kzmw[i*6+3]*2+kzmw[i*6+4];
tmp[i*4+3]=sbox[i][(hang+1)*16+lie]%2;
tmp[i*4+2]=(sbox[i][(hang+1)*16+lie]/2)%2;
tmp[i*4+1]=(sbox[i][(hang+1)*16+lie]/4)%2;
tmp[i*4]=(sbox[i][(hang+1)*16+lie]/8)%2;
}
for(i=0;i<32;i++) //P置換
Ri[i]=tmp[Pzh[i]-1];
Xor(Ri,Li,32); //異或
for(i=0;i<32;i++) //交換左右明文
{
Li[i]=ss[i];
}
}
for(i=0;i<32;i++)
{
tmp[i]=Li[i];
Li[i]=Ri[i];
Ri[i]=tmp[i];
}
for(i=0;i<64;i++)
PMW[i]=MW[fp[i]-1];
BitToByte(Out,PMW,64); //位到位元組的轉換
}
}
void main()
{
char Ki[8],jm[8],final[8];
int i0;
cout<<"請輸入密鑰(8位元組):"<<endl;
for(i0=0;i0<8;i0++)
cin>>Ki[i0];
// if(i0<8)
// for(i0=0;i0<8;i0++)
// cin//[i0];
keyfc(Ki);
cout<<"請輸入明文:"<<endl;
for(i0=0;i0<8;i0++)
cin>>jm[i0];
DES(final,jm,0); //加密
for(i0=0;i0<8;i0++)
cout<<final[i0];
cout<<endl;
DES(jm,final,1); //解密
for(i0=0;i0<8;i0++)
cout<<jm[i0];
cout<<endl;
}
這個事用VC實現
給你演算法你自己看
Ⅱ des是對稱加密演算法還是非對稱加密演算法加密密鑰是多少位
對稱加密的加密和解密密鑰都是一樣的。而非對稱加密的加密和解密密鑰是不一樣的。它們的演算法也是不同的。 l 對稱加密演算法 對稱加密演算法是應用較早的加密演算法,技術成熟。在對稱加密演算法中,數據發信方將明文(原始數據)和加密密鑰一起經過特殊...
Ⅲ des演算法是什麼
DES演算法為密碼體制中的對稱密碼體制,又被稱為美國數據加密標准,是1972年美國IBM公司研製的對稱密碼體制加密演算法。
相關如下
明文按64位進行分組,密鑰長64位,密鑰事實上是56位參與DES運算(第8、16、24、32、40、48、56、64位是校驗位, 使得每個密鑰都有奇數個1)分組後的明文組和56位的密鑰按位替代或交換的方法形成密文組的加密方法。