des算法的主要流程 DES算法的原理及演讲过程

\u6c42\u6559des\u7b97\u6cd5\u7684\u8be6\u7ec6\u8fc7\u7a0b

\u56fe\u4e3a\u6700\u8be6\u7ec6\u7684\u6d41\u7a0b
\u4e0b\u9644\u4e0a\u5b8c\u6574C\u7a0b\u5e8f\uff0c\u6211\u81ea\u5df1\u505a\u7684\uff0c\u4f60\u770b\u770b\u3002
#include "stdio.h"
#include "memory.h"
#include "time.h"
#include "stdlib.h"

#define PLAIN_FILE_OPEN_ERROR -1
#define KEY_FILE_OPEN_ERROR -2
#define CIPHER_FILE_OPEN_ERROR -3
#define OK 1
typedef char ElemType;
/*\u521d\u59cb\u7f6e\u6362\u8868IP*/
int IP_Table[64] = { 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,
56,48,40,32,24,16,8,0,
58,50,42,34,26,18,10,2,
60,52,44,36,28,20,12,4,
62,54,46,38,30,22,14,6};
/*\u9006\u521d\u59cb\u7f6e\u6362\u8868IP^-1*/
int IP_1_Table[64] = {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,
32,0,40,8,48,16,56,24};

/*\u6269\u5145\u7f6e\u6362\u8868E*/
int E_Table[48] = {31, 0, 1, 2, 3, 4,
3, 4, 5, 6, 7, 8,
7, 8,9,10,11,12,
11,12,13,14,15,16,
15,16,17,18,19,20,
19,20,21,22,23,24,
23,24,25,26,27,28,
27,28,29,30,31, 0};

/*\u7f6e\u6362\u51fd\u6570P*/
int P_Table[32] = {15,6,19,20,28,11,27,16,
0,14,22,25,4,17,30,9,
1,7,23,13,31,26,2,8,
18,12,29,5,21,10,3,24};

/*S\u76d2*/
int S[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}}};
/*\u7f6e\u6362\u9009\u62e91*/
int PC_1[56] = {56,48,40,32,24,16,8,
0,57,49,41,33,25,17,
9,1,58,50,42,34,26,
18,10,2,59,51,43,35,
62,54,46,38,30,22,14,
6,61,53,45,37,29,21,
13,5,60,52,44,36,28,
20,12,4,27,19,11,3};

/*\u7f6e\u6362\u9009\u62e92*/
int PC_2[48] = {13,16,10,23,0,4,2,27,
14,5,20,9,22,18,11,3,
25,7,15,6,26,19,12,1,
40,51,30,36,46,54,29,39,
50,44,32,46,43,48,38,55,
33,52,45,41,49,35,28,31};

/*\u5bf9\u5de6\u79fb\u6b21\u6570\u7684\u89c4\u5b9a*/
int MOVE_TIMES[16] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1};
int ByteToBit(ElemType ch,ElemType bit[8]);
int BitToByte(ElemType bit[8],ElemType *ch);
int Char8ToBit64(ElemType ch[8],ElemType bit[64]);
int Bit64ToChar8(ElemType bit[64],ElemType ch[8]);
int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]);
int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]);
int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]);
int DES_ROL(ElemType data[56], int time);
int DES_IP_Transform(ElemType data[64]);
int DES_IP_1_Transform(ElemType data[64]);
int DES_E_Transform(ElemType data[48]);
int DES_P_Transform(ElemType data[32]);
int DES_SBOX(ElemType data[48]);
int DES_XOR(ElemType R[48], ElemType L[48],int count);
int DES_Swap(ElemType left[32],ElemType right[32]);
int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]);
int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48], ElemType plainBlock[8]);
int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile);
int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile);
/*\u5b57\u8282\u8f6c\u6362\u6210\u4e8c\u8fdb\u5236*/
int ByteToBit(ElemType ch, ElemType bit[8]){
int cnt;
for(cnt = 0;cnt < 8; cnt++){
*(bit+cnt) = (ch>>cnt)&1;
}
return 0;
}

/*\u4e8c\u8fdb\u5236\u8f6c\u6362\u6210\u5b57\u8282*/
int BitToByte(ElemType bit[8],ElemType *ch){
int cnt;
for(cnt = 0;cnt < 8; cnt++){
*ch |= *(bit + cnt)<<cnt;
}
return 0;
}

/*\u5c06\u957f\u5ea6\u4e3a8\u7684\u5b57\u7b26\u4e32\u8f6c\u4e3a\u4e8c\u8fdb\u5236\u4f4d\u4e32*/
int Char8ToBit64(ElemType ch[8],ElemType bit[64]){
int cnt;
for(cnt = 0; cnt < 8; cnt++){
ByteToBit(*(ch+cnt),bit+(cnt<<3));
}
return 0;
}

/*\u5c06\u4e8c\u8fdb\u5236\u4f4d\u4e32\u8f6c\u4e3a\u957f\u5ea6\u4e3a8\u7684\u5b57\u7b26\u4e32*/
int Bit64ToChar8(ElemType bit[64],ElemType ch[8]){
int cnt;
memset(ch,0,8);
for(cnt = 0; cnt < 8; cnt++){
BitToByte(bit+(cnt<<3),ch+cnt);
}
return 0;
}

/*\u751f\u6210\u5b50\u5bc6\u94a5*/
int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){
ElemType temp[56];
int cnt;
DES_PC1_Transform(key,temp);/*PC1\u7f6e\u6362*/
for(cnt = 0; cnt < 16; cnt++){/*16\u8f6e\u8dcc\u4ee3\uff0c\u4ea7\u751f16\u4e2a\u5b50\u5bc6\u94a5*/
DES_ROL(temp,MOVE_TIMES[cnt]);/*\u5faa\u73af\u5de6\u79fb*/
DES_PC2_Transform(temp,subKeys[cnt]);/*PC2\u7f6e\u6362\uff0c\u4ea7\u751f\u5b50\u5bc6\u94a5*/
}
return 0;
}

/*\u5bc6\u94a5\u7f6e\u63621*/
int DES_PC1_Transform(ElemType key[64], ElemType tempbts[56]){
int cnt;
for(cnt = 0; cnt < 56; cnt++){
tempbts[cnt] = key[PC_1[cnt]];
}
return 0;
}

/*\u5bc6\u94a5\u7f6e\u63622*/
int DES_PC2_Transform(ElemType key[56], ElemType tempbts[48]){
int cnt;
for(cnt = 0; cnt < 48; cnt++){
tempbts[cnt] = key[PC_2[cnt]];
}
return 0;
}

/*\u5faa\u73af\u5de6\u79fb*/
int DES_ROL(ElemType data[56], int time){
ElemType temp[56];

/*\u4fdd\u5b58\u5c06\u8981\u5faa\u73af\u79fb\u52a8\u5230\u53f3\u8fb9\u7684\u4f4d*/
memcpy(temp,data,time);
memcpy(temp+time,data+28,time);

/*\u524d28\u4f4d\u79fb\u52a8*/
memcpy(data,data+time,28-time);
memcpy(data+28-time,temp,time);

/*\u540e28\u4f4d\u79fb\u52a8*/
memcpy(data+28,data+28+time,28-time);
memcpy(data+56-time,temp+time,time);

return 0;
}

/*IP\u7f6e\u6362*/
int DES_IP_Transform(ElemType data[64]){
int cnt;
ElemType temp[64];
for(cnt = 0; cnt < 64; cnt++){
temp[cnt] = data[IP_Table[cnt]];
}
memcpy(data,temp,64);
return 0;
}

/*IP\u9006\u7f6e\u6362*/
int DES_IP_1_Transform(ElemType data[64]){
int cnt;
ElemType temp[64];
for(cnt = 0; cnt < 64; cnt++){
temp[cnt] = data[IP_1_Table[cnt]];
}
memcpy(data,temp,64);
return 0;
}

/*\u6269\u5c55\u7f6e\u6362*/
int DES_E_Transform(ElemType data[48]){
int cnt;
ElemType temp[48];
for(cnt = 0; cnt < 48; cnt++){
temp[cnt] = data[E_Table[cnt]];
}
memcpy(data,temp,48);
return 0;
}

/*P\u7f6e\u6362*/
int DES_P_Transform(ElemType data[32]){
int cnt;
ElemType temp[32];
for(cnt = 0; cnt < 32; cnt++){
temp[cnt] = data[P_Table[cnt]];
}
memcpy(data,temp,32);
return 0;
}

/*\u5f02\u6216*/
int DES_XOR(ElemType R[48], ElemType L[48] ,int count){
int cnt;
for(cnt = 0; cnt < count; cnt++){
R[cnt] ^= L[cnt];
}
return 0;
}

/*S\u76d2\u7f6e\u6362*/
int DES_SBOX(ElemType data[48]){
int cnt;
int line,row,output;
int cur1,cur2;
for(cnt = 0; cnt < 8; cnt++){
cur1 = cnt*6;
cur2 = cnt<<2;

/*\u8ba1\u7b97\u5728S\u76d2\u4e2d\u7684\u884c\u4e0e\u5217*/
line = (data[cur1]<<1) + data[cur1+5];
row = (data[cur1+1]<<3) + (data[cur1+2]<<2)
+ (data[cur1+3]<<1) + data[cur1+4];
output = S[cnt][line][row];

/*\u5316\u4e3a2\u8fdb\u5236*/
data[cur2] = (output&0X08)>>3;
data[cur2+1] = (output&0X04)>>2;
data[cur2+2] = (output&0X02)>>1;
data[cur2+3] = output&0x01;
}
return 0;
}

/*\u4ea4\u6362*/
int DES_Swap(ElemType left[32], ElemType right[32]){
ElemType temp[32];
memcpy(temp,left,32);
memcpy(left,right,32);
memcpy(right,temp,32);
return 0;
}

/*\u52a0\u5bc6\u5355\u4e2a\u5206\u7ec4*/
int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){
ElemType plainBits[64];
ElemType copyRight[48];
int cnt;

Char8ToBit64(plainBlock,plainBits);
/*\u521d\u59cb\u7f6e\u6362\uff08IP\u7f6e\u6362\uff09*/
DES_IP_Transform(plainBits);

/*16\u8f6e\u8fed\u4ee3*/
for(cnt = 0; cnt < 16; cnt++){
memcpy(copyRight,plainBits+32,32);
/*\u5c06\u53f3\u534a\u90e8\u5206\u8fdb\u884c\u6269\u5c55\u7f6e\u6362\uff0c\u4ece32\u4f4d\u6269\u5c55\u523048\u4f4d*/
DES_E_Transform(copyRight);
/*\u5c06\u53f3\u534a\u90e8\u5206\u4e0e\u5b50\u5bc6\u94a5\u8fdb\u884c\u5f02\u6216\u64cd\u4f5c*/
DES_XOR(copyRight,subKeys[cnt],48);
/*\u5f02\u6216\u7ed3\u679c\u8fdb\u5165S\u76d2\uff0c\u8f93\u51fa32\u4f4d\u7ed3\u679c*/
DES_SBOX(copyRight);
/*P\u7f6e\u6362*/
DES_P_Transform(copyRight);
/*\u5c06\u660e\u6587\u5de6\u534a\u90e8\u5206\u4e0e\u53f3\u534a\u90e8\u5206\u8fdb\u884c\u5f02\u6216*/
DES_XOR(plainBits,copyRight,32);
if(cnt != 15){
/*\u6700\u7ec8\u5b8c\u6210\u5de6\u53f3\u90e8\u7684\u4ea4\u6362*/
DES_Swap(plainBits,plainBits+32);
}
}
/*\u9006\u521d\u59cb\u7f6e\u6362\uff08IP^1\u7f6e\u6362\uff09*/
DES_IP_1_Transform(plainBits);
Bit64ToChar8(plainBits,cipherBlock);
return 0;
}

/*\u89e3\u5bc6\u5355\u4e2a\u5206\u7ec4*/
int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48],ElemType plainBlock[8]){
ElemType cipherBits[64];
ElemType copyRight[48];
int cnt;

Char8ToBit64(cipherBlock,cipherBits);
/*\u521d\u59cb\u7f6e\u6362\uff08IP\u7f6e\u6362\uff09*/
DES_IP_Transform(cipherBits);

/*16\u8f6e\u8fed\u4ee3*/
for(cnt = 15; cnt >= 0; cnt--){
memcpy(copyRight,cipherBits+32,32);
/*\u5c06\u53f3\u534a\u90e8\u5206\u8fdb\u884c\u6269\u5c55\u7f6e\u6362\uff0c\u4ece32\u4f4d\u6269\u5c55\u523048\u4f4d*/
DES_E_Transform(copyRight);
/*\u5c06\u53f3\u534a\u90e8\u5206\u4e0e\u5b50\u5bc6\u94a5\u8fdb\u884c\u5f02\u6216\u64cd\u4f5c*/
DES_XOR(copyRight,subKeys[cnt],48);
/*\u5f02\u6216\u7ed3\u679c\u8fdb\u5165S\u76d2\uff0c\u8f93\u51fa32\u4f4d\u7ed3\u679c*/
DES_SBOX(copyRight);
/*P\u7f6e\u6362*/
DES_P_Transform(copyRight);
/*\u5c06\u660e\u6587\u5de6\u534a\u90e8\u5206\u4e0e\u53f3\u534a\u90e8\u5206\u8fdb\u884c\u5f02\u6216*/
DES_XOR(cipherBits,copyRight,32);
if(cnt != 0){
/*\u6700\u7ec8\u5b8c\u6210\u5de6\u53f3\u90e8\u7684\u4ea4\u6362*/
DES_Swap(cipherBits,cipherBits+32);
}
}
/*\u9006\u521d\u59cb\u7f6e\u6362\uff08IP^1\u7f6e\u6362\uff09*/
DES_IP_1_Transform(cipherBits);
Bit64ToChar8(cipherBits,plainBlock);
return 0;
}

/*\u52a0\u5bc6\u6587\u4ef6*/
int DES_Encrypt(char *plainFile, char *keyStr,char *cipherFile){
FILE *plain,*cipher;
int count;
ElemType plainBlock[8],cipherBlock[8],keyBlock[8];
ElemType bKey[64];
ElemType subKeys[16][48];
if((plain = fopen(plainFile,"rb")) == NULL){
return PLAIN_FILE_OPEN_ERROR;
}
if((cipher = fopen(cipherFile,"wb")) == NULL){
return CIPHER_FILE_OPEN_ERROR;
}
/*\u8bbe\u7f6e\u5bc6\u94a5*/
memcpy(keyBlock,keyStr,8);
/*\u5c06\u5bc6\u94a5\u8f6c\u6362\u4e3a\u4e8c\u8fdb\u5236\u6d41*/
Char8ToBit64(keyBlock,bKey);
/*\u751f\u6210\u5b50\u5bc6\u94a5*/
DES_MakeSubKeys(bKey,subKeys);

while(!feof(plain)){
/*\u6bcf\u6b21\u8bfb8\u4e2a\u5b57\u8282\uff0c\u5e76\u8fd4\u56de\u6210\u529f\u8bfb\u53d6\u7684\u5b57\u8282\u6570*/
if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){
DES_EncryptBlock(plainBlock,subKeys,cipherBlock);
fwrite(cipherBlock,sizeof(char),8,cipher);
}
}
if(count){
/*\u586b\u5145*/
memset(plainBlock + count,'\0',7 - count);
/*\u6700\u540e\u4e00\u4e2a\u5b57\u7b26\u4fdd\u5b58\u5305\u62ec\u6700\u540e\u4e00\u4e2a\u5b57\u7b26\u5728\u5185\u7684\u6240\u586b\u5145\u7684\u5b57\u7b26\u6570\u91cf*/
plainBlock[7] = 8 - count;
DES_EncryptBlock(plainBlock,subKeys,cipherBlock);
fwrite(cipherBlock,sizeof(char),8,cipher);
}
fclose(plain);
fclose(cipher);
return OK;
}

/*\u89e3\u5bc6\u6587\u4ef6*/
int DES_Decrypt(char *cipherFile, char *keyStr,char *plainFile){
FILE *plain, *cipher;
int count,times = 0;
long fileLen;
ElemType plainBlock[8],cipherBlock[8],keyBlock[8];
ElemType bKey[64];
ElemType subKeys[16][48];
if((cipher = fopen(cipherFile,"rb")) == NULL){
return CIPHER_FILE_OPEN_ERROR;
}
if((plain = fopen(plainFile,"wb")) == NULL){
return PLAIN_FILE_OPEN_ERROR;
}

/*\u8bbe\u7f6e\u5bc6\u94a5*/
memcpy(keyBlock,keyStr,8);
/*\u5c06\u5bc6\u94a5\u8f6c\u6362\u4e3a\u4e8c\u8fdb\u5236\u6d41*/
Char8ToBit64(keyBlock,bKey);
/*\u751f\u6210\u5b50\u5bc6\u94a5*/
DES_MakeSubKeys(bKey,subKeys);

/*\u53d6\u6587\u4ef6\u957f\u5ea6 */
fseek(cipher,0,SEEK_END);/*\u5c06\u6587\u4ef6\u6307\u9488\u7f6e\u5c3e*/
fileLen = ftell(cipher); /*\u53d6\u6587\u4ef6\u6307\u9488\u5f53\u524d\u4f4d\u7f6e*/
rewind(cipher); /*\u5c06\u6587\u4ef6\u6307\u9488\u91cd\u6307\u5411\u6587\u4ef6\u5934*/
while(1){
/*\u5bc6\u6587\u7684\u5b57\u8282\u6570\u4e00\u5b9a\u662f8\u7684\u6574\u6570\u500d*/
fread(cipherBlock,sizeof(char),8,cipher);
DES_DecryptBlock(cipherBlock,subKeys,plainBlock);
times += 8;
if(times < fileLen){
fwrite(plainBlock,sizeof(char),8,plain);
}
else{
break;
}
}
/*\u5224\u65ad\u672b\u5c3e\u662f\u5426\u88ab\u586b\u5145*/
if(plainBlock[7] < 8){
for(count = 8 - plainBlock[7]; count < 7; count++){
if(plainBlock[count] != '\0'){
break;
}
}
}
if(count == 7){/*\u6709\u586b\u5145*/
fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain);
}
else{/*\u65e0\u586b\u5145*/
fwrite(plainBlock,sizeof(char),8,plain);
}

fclose(plain);
fclose(cipher);
return OK;
}
int main()
{
clock_t a,b;
a = clock();
DES_Encrypt("1.txt","key.txt","2.txt");
b = clock();
printf("\u52a0\u5bc6\u6d88\u8017%d\u6beb\u79d2\n",b-a);

system("pause");
a = clock();
DES_Decrypt("2.txt","key.txt","3.txt");
b = clock();
printf("\u89e3\u5bc6\u6d88\u8017%d\u6beb\u79d2\n",b-a);
getchar();
return 0;
}

DES\u7b97\u6cd5\u4e3a\u5bc6\u7801\u4f53\u5236\u4e2d\u7684\u5bf9\u79f0\u5bc6\u7801\u4f53\u5236\uff0c\u53c8\u88ab\u79f0\u4e3a\u7f8e\u56fd\u6570\u636e\u52a0\u5bc6\u6807\u51c6\uff0c\u662f1972\u5e74\u7f8e\u56fdIBM\u516c\u53f8\u7814\u5236\u7684\u5bf9\u79f0\u5bc6\u7801\u4f53\u5236\u52a0\u5bc6\u7b97\u6cd5\u3002 \u660e\u6587\u630964\u4f4d\u8fdb\u884c\u5206\u7ec4\uff0c\u5bc6\u94a5\u957f64\u4f4d\uff0c\u5bc6\u94a5\u4e8b\u5b9e\u4e0a\u662f56\u4f4d\u53c2\u4e0eDES\u8fd0\u7b97\uff08\u7b2c8\u300116\u300124\u300132\u300140\u300148\u300156\u300164\u4f4d\u662f\u6821\u9a8c\u4f4d\uff0c \u4f7f\u5f97\u6bcf\u4e2a\u5bc6\u94a5\u90fd\u6709\u5947\u6570\u4e2a1\uff09\u5206\u7ec4\u540e\u7684\u660e\u6587\u7ec4\u548c56\u4f4d\u7684\u5bc6\u94a5\u6309\u4f4d\u66ff\u4ee3\u6216\u4ea4\u6362\u7684\u65b9\u6cd5\u5f62\u6210\u5bc6\u6587\u7ec4\u7684\u52a0\u5bc6\u65b9\u6cd5\u3002

DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位,整个算法的主流程图如下: 其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则见下表:
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,
即将输入的第58位换到第一位,第50位换到第2位,...,依此类推,最后一位是原来的第7位。L0、R0则是换位输出后的两部分,L0是输出的左32位,R0 是右32位,例:设置换前的输入值为D1D2D3......D64,则经过初始置换后的结果为:L0=D58D50...D8;R0=D57D49...D7。
经过16次迭代运算后。得到L16、R16,将此作为输入,进行逆置换,即得到密文输出。逆置换正好是初始置换的逆运算。例如,第1位经过初始置换后,处于第40位,而通过逆置换,又将第40位换回到第1位,其逆置换规则如下表所示:
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, 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, 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, 在f(Ri,Ki)算法描述图中,S1,S2...S8为选择函数,其功能是把48bit数据变为32bit数据。下面给出选择函数Si(i=1,2......8)的功能表:
选择函数Si
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,
在此以S1为例说明其功能,我们可以看到:在S1中,共有4行数据,命名为0,1、2、3行;每行有16列,命名为0、1、2、3,......,14、15列。
现设输入为:D=D1D2D3D4D5D6
令:列=D2D3D4D5
行=D1D6
然后在S1表中查得对应的数,以4位二进制表示,此即为选择函数S1的输出。下面给出子密钥Ki(48bit)的生成算法 1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1
以上介绍了DES算法的加密过程。DES算法的解密过程是一样的,区别仅仅在于第一次迭代时用子密钥K15,第二次K14、......,最后一次用K0,算法本身并没有任何变化。



  • DES绠楁硶涓昏鏈夊摢鍑犱釜姝ラ?
    绛旓細5)閫嗗垵濮嬬疆鎹;6)杈撳嚭銆
  • des绠楁硶涓昏娴佺▼
    绛旓細DES绠楁硶鐨勪富瑕佹祦绋嬫槸灏64浣嶇殑鏄庢枃杈撳叆鍧楄浆鎹㈡垚64浣嶇殑瀵嗘枃杈撳嚭鍧楋紝浣跨敤鍚屾牱闀垮害涓64浣嶇殑瀵嗛挜杩涜鍔犲瘑銆傛暣涓繃绋嬪彲浠ュ垎涓哄嚑涓楠:棣栧厛锛岃緭鍏ョ殑64浣嶆暟鎹潡閫氳繃缃崲瑙勫垯琛ㄨ繘琛屽垵濮嬪鐞嗐傝琛ㄥ皢鏁版嵁浣嶈繘琛岄噸鏂扮粍鍚堬紝灏嗚緭鍑哄垎涓篖0锛堝乏32浣嶏級鍜孯0锛堝彸32浣嶏級锛屼緥濡傦紝杈撳叆鐨勭58浣嶅皢绉诲姩鍒扮涓浣嶏紝浠ユ绫绘帹...
  • 姹des C#绠楁硶
    绛旓細s鐩掔殑杩囩▼锛氭妸48浣嶅垎鎴8涓6浣嶏紝鍙6浣嶇殑绗竴浣嶅拰鏈鍚庝竴浣嶏紝杩欎袱浣嶇粍鎴愮殑鏁颁綔涓簊鐩掔殑琛岋紝鍏朵粬涓変綅浣滀负鍒锛岀煡閬撹鍒楀悗灏卞湪s鐩掕〃涓煡鍒板搴旂殑鐨勬暟锛岃繖涓暟鏄4浣嶇殑锛屽氨鐢ㄨ繖涓4浣嶇殑鏁颁唬鏇胯6浣嶇殑鏁般傛墍浠ユ渶鍚庡嚭鏉ョ殑鏄32浣嶄簡銆4.f鍑芥暟鍚庯紝閲嶇粍宸﹀彸閮ㄥ垎锛屽緱鍒64浣嶏紝鍐嶄竴娆℃湯缃崲灏卞緱鍒颁簡鐢╠es鍔犲瘑鍚...
  • des绠楁硶鐨勪富瑕佹祦绋
    绛旓細DES绠楁硶鎶64浣嶇殑鏄庢枃杈撳叆鍧楀彉涓64浣嶇殑瀵嗘枃杈撳嚭鍧楋紝瀹冩墍浣跨敤鐨勫瘑閽ヤ篃鏄64浣嶏紝鏁翠釜绠楁硶鐨涓娴佺▼鍥惧涓嬶細 鍏跺姛鑳芥槸鎶婅緭鍏ョ殑64浣嶆暟鎹潡鎸変綅閲嶆柊缁勫悎锛屽苟鎶婅緭鍑哄垎涓篖0銆丷0涓ら儴鍒嗭紝姣忛儴鍒嗗悇闀32浣嶏紝鍏剁疆鎹㈣鍒欒涓嬭〃锛58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,...
  • 姹DES鍔犲瘑绠楁硶璇﹁В鎷滄墭浜嗗悇浣 璋㈣阿
    绛旓細杩涜16杞殑鍔犲瘑鍙樻崲涔嬪悗,灏哃16鍜孯16鍚堟垚64浣嶇殑鏁版嵁,鍐嶆寜鐓ц〃2鎵绀虹殑 鏈鍚庢崲浣嶈〃杩涜IP-1鐨勬崲浣,寰楀埌64浣嶇殑瀵嗘枃,杩欏氨鏄DES绠楁硶鍔犲瘑鐨勭粨鏋溿 2.鍔犲瘑鍙樻崲杩囩▼ 閫氳繃閲嶅鏌愪簺浣嶅皢32浣嶇殑鍙冲崐閮ㄥ垎鎸夌収鎵╁睍琛3鎵╁睍鎹綅琛ㄦ墿灞曚负48浣,鑰56浣嶇殑瀵嗛挜鍏堢Щ浣嶇劧鍚庨氳繃閫夋嫨鍏朵腑鐨勬煇浜涗綅鍑忓皯鑷48浣,48浣嶇殑鍙...
  • DES鍔犲瘑绠楁硶
    绛旓細棣栧厛锛DES鐨鍔犲瘑杩囩▼浠庢帴鏀64姣旂壒鐨勫瘑閽ュ紑濮嬶紝閫氳繃PC1鍜孭C2缃崲瀛愬瘑閽ョ敓鎴愯繃绋嬶紝涓哄悗缁疆鍑芥暟鎻愪緵涓嶅悓闃舵鐨勫瘑閽ャ傛瘡涓瓙瀵嗛挜鍦16杞姞瀵嗕腑杞祦浣跨敤锛屾瘡杞姞瀵嗗寘鎷袱涓楠わ細S鐩掞紙Substitution Box锛夐潪绾挎у鐞嗗拰P鐩掞紙Permutation Box锛夌疆鎹紝杩欎袱涓楠ょ揣瀵嗛厤鍚堬紝浣垮緱鍔犲瘑鍙樺緱鏋佸叾澶嶆潅锛岄毦浠ョ牬瑙c係鐩掓槸DES鍔...
  • 瀵圭О鍔犲瘑绠楁硶涔DES浠嬬粛
    绛旓細DES鍔犲瘑杩囩▼鍒嗘瀽: (1)銆侀鍏堣鐢熸垚64浣嶅瘑閽,杩64浣嶇殑瀵嗛挜缁忚繃鈥滃瓙瀵嗛挜绠楁硶鈥濇崲杞悗,灏嗗緱鍒版诲叡16涓瓙瀵嗛挜銆傚皢杩欎簺瀛愬瘑閽ユ爣璇嗕负Kn(n=1,2,鈥,16)銆傝繖浜涘瓙瀵嗛挜涓昏鐢ㄤ簬鎬诲叡鍗佸叚娆$殑鍔犲瘑杩唬杩囩▼涓殑鍔犲瘑宸ュ叿銆 (2)銆佸叾娆¤灏嗘槑鏂囦俊鎭寜64浣嶆暟鎹牸寮忎负涓缁,瀵规墍鏈夋槑鏂囦俊鎭繘琛屽垎缁勫鐞嗐傛瘡涓娈电殑64浣嶆槑鏂囬兘瑕佺粡...
  • 鏈夊叧DES绠楁硶鐨涓閬撹瘉鏄庨
    绛旓細DES绠楁硶鐨鍔犲瘑娴佺▼濡備笅锛氾紙1锛夌敓鎴愬瓙瀵嗛挜 棣栧厛锛屽皢64姣旂壒鐨勫瘑閽ワ紙瀹為檯鏈夋晥浣嶆暟鍙湁56姣旂壒锛夎繘琛岀疆鎹紝寰楀埌56姣旂壒鐨勫瘑閽ヤ覆锛涚劧鍚庯紝灏56姣旂壒鐨勪覆鍒嗕负涓や釜28姣旂壒鐨勫瓙涓诧紝缁忚繃16杞殑寰幆宸︾Щ浠ュ強鍚堝苟缃崲锛岀敓鎴16涓瓙瀵嗛挜锛岃涓篕1K2K3...K16锛涳紙2锛夊姞瀵 棣栧厛锛屽皢64姣旂壒鐨勬槑鏂嘩鍋氬垵濮嬬疆鎹紝寰楀埌缁撴灉IP锛...
  • DES绠楁硶瀹炵幇
    绛旓細DES绠楁硶鐨勫熀鏈祦绋鍥惧涓嬶細DES绠楁硶鏄吀鍨嬬殑瀵圭О鍔犲瘑绠楁硶锛屽湪杈撳叆64姣旂壒鏄庢枃鏁版嵁鍚庯紝閫氳繃杈撳叆64姣旂壒瀵嗛挜鍜岀畻娉曠殑涓绯诲垪鍔犲瘑姝ラ鍚庯紝鍙互寰楀埌鍚屾牱涓64姣旂壒鐨勫瘑鏂囨暟鎹傚弽涔嬶紝鎴戜滑閫氳繃宸茬煡鐨勫瘑閽ワ紝鍙互灏嗗瘑鏂囨暟鎹浆鎹㈠洖鏄庢枃銆 鎴戜滑灏嗙畻娉曞垎涓轰簡涓夊ぇ鍧楋細IP缃崲銆16娆杩唬鍜孖P閫嗙疆鎹 锛屽姞瀵嗗拰瑙e瘑杩囩▼鍒嗗埆濡備笅锛...
  • des鍔犲瘑绠楁硶
    绛旓細DES绠楁硶鍏蜂綋閫氳繃瀵规槑鏂囪繘琛屼竴绯诲垪鐨勬帓鍒楀拰鏇挎崲鎿嶄綔鏉ュ皢鍏跺姞瀵嗐杩囩▼鐨勫叧閿氨鏄粠缁欏畾鐨勫垵濮嬪瘑閽ヤ腑寰楀埌16涓瓙瀵嗛挜鐨勫嚱鏁般傝鍔犲瘑涓缁勬槑鏂囷紝姣忎釜瀛愬瘑閽ユ寜鐓ч『搴忥紙1-16锛変互涓绯诲垪鐨勪綅鎿嶄綔鏂藉姞浜庢暟鎹笂锛屾瘡涓瓙瀵嗛挜涓娆★紝涓鍏遍噸澶16娆°傛瘡涓娆¤凯浠gО涔嬩负涓杞傝瀵瑰瘑鏂囪繘琛岃В瀵嗗彲浠ラ噰鐢ㄥ悓鏍风殑姝ラ锛屽彧鏄瓙瀵嗛挜...
  • 扩展阅读:简述des算法的加密流程 ... des算法简易流程 ... 请说明des算法的基本过程 ... aes算法基本步骤 ... des算法的迭代变换过程 ... des一轮的算法框图 ... des加密流程图 ... des算法13步加密流程 ... 画出des解密算法的流程图 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网