问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求教des算法的详细过程

发布网友 发布时间:2022-05-01 17:38

我来回答

2个回答

热心网友 时间:2022-06-20 10:18

图为最详细的流程 

下附上完整C程序,我自己做的,你看看。

#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; 

 /*初始置换表IP*/

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}; 

/*逆初始置换表IP^-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};

  

/*扩充置换表E*/

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};

  

/*置换函数P*/

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盒*/

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}}};

/*置换选择1*/

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};

  

/*置换选择2*/

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};

  

/*对左移次数的规定*/

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);  

/*字节转换成二进制*/

int ByteToBit(ElemType ch, ElemType bit[8]){

 int cnt;

 for(cnt = 0;cnt < 8; cnt++){

  *(bit+cnt) = (ch>>cnt)&1;

 }

 return 0;

}

  

/*二进制转换成字节*/

int BitToByte(ElemType bit[8],ElemType *ch){

 int cnt;

 for(cnt = 0;cnt < 8; cnt++){

  *ch |= *(bit + cnt)<<cnt;

 }

 return 0;

}

  

/*将长度为8的字符串转为二进制位串*/

int Char8ToBit64(ElemType ch[8],ElemType bit[64]){

 int cnt;

 for(cnt = 0; cnt < 8; cnt++){  

  ByteToBit(*(ch+cnt),bit+(cnt<<3));

 }

 return 0;

}

  

/*将二进制位串转为长度为8的字符串*/

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;

}

  

/*生成子密钥*/

int DES_MakeSubKeys(ElemType key[64],ElemType subKeys[16][48]){

 ElemType temp[56];

 int cnt;

 DES_PC1_Transform(key,temp);/*PC1置换*/

 for(cnt = 0; cnt < 16; cnt++){/*16轮跌代,产生16个子密钥*/

  DES_ROL(temp,MOVE_TIMES[cnt]);/*循环左移*/

  DES_PC2_Transform(temp,subKeys[cnt]);/*PC2置换,产生子密钥*/

 }

 return 0;

}

  

/*密钥置换1*/

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;

}

  

/*密钥置换2*/

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;

}

  

/*循环左移*/

int DES_ROL(ElemType data[56], int time){

 ElemType temp[56];

  

 /*保存将要循环移动到右边的位*/

 memcpy(temp,data,time);

 memcpy(temp+time,data+28,time);

 

 /*前28位移动*/

 memcpy(data,data+time,28-time);

 memcpy(data+28-time,temp,time);

  

 /*后28位移动*/

 memcpy(data+28,data+28+time,28-time);

 memcpy(data+56-time,temp+time,time); 

  

 return 0;

}

  

/*IP置换*/

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逆置换*/

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;

}

  

/*扩展置换*/

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置换*/

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;

}

  

/*异或*/

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盒置换*/

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;

  

  /*计算在S盒中的行与列*/

  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];

  

  /*化为2进制*/

  data[cur2] = (output&0X08)>>3;

  data[cur2+1] = (output&0X04)>>2;

  data[cur2+2] = (output&0X02)>>1;

  data[cur2+3] = output&0x01;

 }

 return 0;

}

  

/*交换*/

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;

}

  

/*加密单个分组*/

int DES_EncryptBlock(ElemType plainBlock[8], ElemType subKeys[16][48], ElemType cipherBlock[8]){

 ElemType plainBits[64];

 ElemType copyRight[48];

 int cnt;

  

 Char8ToBit64(plainBlock,plainBits);  

 /*初始置换(IP置换)*/

 DES_IP_Transform(plainBits);

  

 /*16轮迭代*/

 for(cnt = 0; cnt < 16; cnt++){ 

  memcpy(copyRight,plainBits+32,32);

  /*将右半部分进行扩展置换,从32位扩展到48位*/

  DES_E_Transform(copyRight);

  /*将右半部分与子密钥进行异或操作*/

  DES_XOR(copyRight,subKeys[cnt],48); 

  /*异或结果进入S盒,输出32位结果*/

  DES_SBOX(copyRight);

  /*P置换*/

  DES_P_Transform(copyRight);

  /*将明文左半部分与右半部分进行异或*/

  DES_XOR(plainBits,copyRight,32);

  if(cnt != 15){

/*最终完成左右部的交换*/

DES_Swap(plainBits,plainBits+32);

  }

 }

 /*逆初始置换(IP^1置换)*/

 DES_IP_1_Transform(plainBits);

 Bit64ToChar8(plainBits,cipherBlock);

 return 0;

}

  

/*解密单个分组*/

int DES_DecryptBlock(ElemType cipherBlock[8], ElemType subKeys[16][48],ElemType plainBlock[8]){

 ElemType cipherBits[64];

 ElemType copyRight[48];

 int cnt;

  

 Char8ToBit64(cipherBlock,cipherBits); 

 /*初始置换(IP置换)*/

 DES_IP_Transform(cipherBits);

 

 /*16轮迭代*/

 for(cnt = 15; cnt >= 0; cnt--){

  memcpy(copyRight,cipherBits+32,32);

  /*将右半部分进行扩展置换,从32位扩展到48位*/

  DES_E_Transform(copyRight);

  /*将右半部分与子密钥进行异或操作*/

  DES_XOR(copyRight,subKeys[cnt],48);  

  /*异或结果进入S盒,输出32位结果*/

  DES_SBOX(copyRight);

  /*P置换*/

  DES_P_Transform(copyRight);  

  /*将明文左半部分与右半部分进行异或*/

  DES_XOR(cipherBits,copyRight,32);

  if(cnt != 0){

/*最终完成左右部的交换*/

DES_Swap(cipherBits,cipherBits+32);

  }

 }

 /*逆初始置换(IP^1置换)*/

 DES_IP_1_Transform(cipherBits);

 Bit64ToChar8(cipherBits,plainBlock);

 return 0;

}

  

/*加密文件*/

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;

 }

 /*设置密钥*/

 memcpy(keyBlock,keyStr,8);

 /*将密钥转换为二进制流*/

 Char8ToBit64(keyBlock,bKey);

 /*生成子密钥*/

 DES_MakeSubKeys(bKey,subKeys);

 

 while(!feof(plain)){

  /*每次读8个字节,并返回成功读取的字节数*/

  if((count = fread(plainBlock,sizeof(char),8,plain)) == 8){

DES_EncryptBlock(plainBlock,subKeys,cipherBlock);

fwrite(cipherBlock,sizeof(char),8,cipher);  

  }

 }

 if(count){

  /*填充*/

  memset(plainBlock + count,'\0',7 - count);

  /*最后一个字符保存包括最后一个字符在内的所填充的字符数量*/

  plainBlock[7] = 8 - count;

  DES_EncryptBlock(plainBlock,subKeys,cipherBlock);

  fwrite(cipherBlock,sizeof(char),8,cipher);

 }

 fclose(plain);

 fclose(cipher);

 return OK;

}

  

/*解密文件*/

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;

 }

  

 /*设置密钥*/

 memcpy(keyBlock,keyStr,8);

 /*将密钥转换为二进制流*/

 Char8ToBit64(keyBlock,bKey);

 /*生成子密钥*/

 DES_MakeSubKeys(bKey,subKeys);

  

 /*取文件长度 */

 fseek(cipher,0,SEEK_END);/*将文件指针置尾*/

 fileLen = ftell(cipher); /*取文件指针当前位置*/

 rewind(cipher); /*将文件指针重指向文件头*/

 while(1){

  /*密文的字节数一定是8的整数倍*/

  fread(cipherBlock,sizeof(char),8,cipher);

  DES_DecryptBlock(cipherBlock,subKeys,plainBlock);  

  times += 8;

  if(times < fileLen){

fwrite(plainBlock,sizeof(char),8,plain);

  }

  else{

break;

  }

 }

 /*判断末尾是否被填充*/

 if(plainBlock[7] < 8){

  for(count = 8 - plainBlock[7]; count < 7; count++){

if(plainBlock[count] != '\0'){

 break;

}

  }

 }

 if(count == 7){/*有填充*/

  fwrite(plainBlock,sizeof(char),8 - plainBlock[7],plain);

 }

 else{/*无填充*/

  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("加密消耗%d毫秒\n",b-a);

 

 system("pause");

 a = clock();

 DES_Decrypt("2.txt","key.txt","3.txt");

 b = clock();

 printf("解密消耗%d毫秒\n",b-a);

 getchar();

 return 0;

}

热心网友 时间:2022-06-20 10:18

    des算法的详细过程:
  1-1、变换密钥
  取得64位的密钥,每个第8位作为奇偶校验位。
  1-2、变换密钥。
  1-2-1、舍弃64位密钥中的奇偶校验位,根据下表(PC-1)进行密钥变换得到56位的密钥,在变换中,奇偶校验位以被舍弃。
  Permuted Choice 1 (PC-1)
  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
  1-2-2、将变换后的密钥分为两个部分,开始的28位称为C[0],最后的28位称为D[0]。
  1-2-3、生成16个子密钥,初始I=1。
  1-2-3-1、同时将C[I]、D[I]左移1位或2位,根据I值决定左移的位数。见下表
  I: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
  左移位数: 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
  1-2-3-2、将C[I]D[I]作为一个整体按下表(PC-2)变换,得到48位的K[I]
  Permuted Choice 2 (PC-2)
  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
  1-2-3-3、从1-2-3-1处循环执行,直到K[16]被计算完成。
  2、处理64位的数据
  2-1、取得64位的数据,如果数据长度不足64位,应该将其扩展为64位(例如补零)
  2-2、将64位数据按下表变换(IP)
  Initial Permutation (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
  2-3、将变换后的数据分为两部分,开始的32位称为L[0],最后的32位称为R[0]。
  2-4、用16个子密钥加密数据,初始I=1。
  2-4-1、将32位的R[I-1]按下表(E)扩展为48位的E[I-1]
  Expansion (E)
  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
  2-4-2、异或E[I-1]和K[I],即E[I-1] XOR K[I]
  2-4-3、将异或后的结果分为8个6位长的部分,第1位到第6位称为B[1],第7位到第12位称为B[2],依此类推,第43位到第48位称为B[8]。
  2-4-4、按S表变换所有的B[J],初始J=1。所有在S表的值都被当作4位长度处理。
  2-4-4-1、将B[J]的第1位和第6位组合为一个2位长度的变量M,M作为在S[J]中的行号。
  2-4-4-2、将B[J]的第2位到第5位组合,作为一个4位长度的变量N,N作为在S[J]中的列号。
  2-4-4-3、用S[J][M][N]来取代B[J]。
  Substitution Box 1 (S[1])
  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
  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 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 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 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 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 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
  2-4-4-4、从2-4-4-1处循环执行,直到B[8]被替代完成。
  2-4-4-5、将B[1]到B[8]组合,按下表(P)变换,得到P。
  Permutation 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
  2-4-6、异或P和L[I-1]结果放在R[I],即R[I]=P XOR L[I-1]。
  2-4-7、L[I]=R[I-1]
  2-4-8、从2-4-1处开始循环执行,直到K[16]被变换完成。
  2-4-5、组合变换后的R[16]L[16](注意:R作为开始的32位),按下表(IP-1)变换得到最后的结果。
  Final Permutation (IP**-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
  以上就是DES算法的描述。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
炒股怎么买进卖出? 办一个餐饮的营业执照要多少钱 上海贷款平台有哪些 上海有什么网贷 Intel 赛扬D325 2.53G与多大频率的内存匹配 Intel 赛扬D 352(散)重要参数 CPU Intel 赛扬D 326 这个东西怎么看的? Intel 赛扬D 326(散)重要参数 Intel 赛扬D 325(盒)重要参数 Intel 赛扬D 325(盒)Intel 赛扬D 325(盒)详细参数 winrar密码真的能破解吗? 如何用 视差法算 地球到天狼星的距离 怎样到网上查电费 求杭州电费网上查询的网站 永嘉电费缴费单位 DIYER 高手!!!救命!! 杭州水电费在哪个网上查询 求美的F28B热水器使用说明?要详细的!说明书找不到了,好多功能不是很懂! 电脑是XP系统,显示器字体亮的太刺眼,键盘也没有调节亮度的按键,请问具体怎么调整,在线等 27毫米加27毫米加31毫米等于几厘米几毫米 30毫米等于多少厘米30毫米等于多少厘米30毫米等于多少厘米30毫米等于多少厘米 头臂长31mm是多大厘米 31mm=()cm+()mm 31MM等于多少厘米 计算机二级弃考会记入诚信档案吗? 2010有什么好看的搞笑电影,我要国产的。 我要搜索一个国产电视剧 很急 《我要准时下班》国产翻拍改剧名,有哪些演员加盟? 现在有什么好看点的大片没得 我要国产的 。。。 谁有最新的国产POM塑料价格的走势图?我想看看最近涨价了还是降了?免费的网站也可以 若串行通信要求br=57600bps,pcck=66.7MHZ,计算并设置波特女率初值,速度 计算机安全技术2 大家屏幕亮度都是怎么调的,感觉我的好刺眼 联合国安理会 有几个常任理事国 几个非常任理事国 联合国安理会共有多少个理事国?分别是哪些国家? OPPOR15和VIVOY30哪个屏幕好? vivou3x和oppor15哪个更好玩游戏? 今年发售的新型手机里,vivox21和oppor15哪个好啊? vivo x play6和OPPOr15选哪个更好 网易的163邮箱和126邮箱有什么区别?哪个更好? 网易邮箱到底是指网易163还是网易126 网易163邮箱和126邮箱有什么区别 鸡心领双层的怎么织?织好了怎么收针? 女驸马这首歌的原唱是谁 女驸马 原唱谁唱的 时长是多少 慕容晓晓的歌曲黄梅戏中女附马的唱词是慕容晓晓唱的吗?声音不像啊?是谁唱的? 求歌,女声,歌中伴有几句《女驸马》的歌词,绝对不是《女驸马》的原句原唱啊,是另一首歌, 请问谁有黄梅戏“女驸马”的原唱和伴奏,急用,谢谢, 不是《女驸马》的原句原唱哦,是现代歌中伴有几句歌词而已 炕上没有糖果和吃的,怎么还会有蚂蚁