code.txt
上传用户:arge456321
上传日期:2022-08-05
资源大小:2k
文件大小:5k
源码类别:

加密解密

开发平台:

Visual C++

  1. // s-des.cpp : 定义控制台应用程序的入口点。
  2. //实现S-DES对任意文件的加解密
  3. #include "stdafx.h"
  4. #include <string.h>
  5. #include <windows.h>
  6. #include "stdafx.h"
  7. #include <stdio.h>
  8.  int p10[10]={3,5,2,7,4,10,1,9,8,6};   //P10的置换表
  9.         int p8[8]={6,3,7,4,8,5,10,9};  //P8的置换表
  10.         int ip[8]={2,6,3,1,4,8,5,7};   //iP的置换表
  11.         int ip_1[8]={4,1,3,5,7,2,8,6}; //iP_1的置换表
  12.         int ep[8]={4,1,2,3,2,3,4,1};   //ep的置换表
  13.         int P4[4]={2,4,3,1};          //P4的置换表
  14.  int s0[4][4]={{1,0,3,2},{3,2,1,0},{0,2,1,3},{3,1,3,2}};
  15.  int s1[4][4]={{0,1,2,3},{2,0,1,3},{3,0,1,0},{2,1,0,3}};
  16. void  Permutation(int in[],int out[], int table[], int tablelength)
  17. {  //P10、p8、ip、ep、ip_1、p4的置换操作,结果保存在out中
  18.     int i = 0;
  19.     for ( i=0; i<tablelength; i++)
  20.         out[i] = in[ table[i] -1 ];
  21. }
  22. void Amalgmate(int word[],int l_word[],int r_word[],int length)  //合并两个数组,并保存在word中
  23. {
  24. int i;
  25. for(i=0;i<length;i++)
  26. {
  27.     if(i<length/2)
  28. word[i]=l_word[i];
  29. else
  30. word[i]=r_word[i-length/2];
  31. }
  32. }
  33. void Subkey(int key[], int subkey[], int N)  //循环左移 N次 (N为多少就左移几位,循环一次得到K1,循环2次得到K2)
  34. {
  35.    
  36. int i,l_temp[5]={0},r_temp[5]={0};
  37.    for(i=0;i<5;i++)
  38.    {
  39.    l_temp[i]=key[(i+N)%5];
  40.    r_temp[i]=key[5+(i+N)%5];
  41.    }
  42. Amalgmate(key,l_temp,r_temp,10);  
  43.     Permutation(key,subkey,p8,8);   //P8操作,得到 subkey
  44. }
  45. void XOR(int key1[],int key2[],int length1) //异或操作,把结果保存在key1中
  46. {
  47.    int i;
  48.    for(i=0;i<length1;i++)
  49.    key1[i]=key1[i]^key2[i];
  50. }
  51.  
  52. void swap(int data[])   //SW交换函数,用于高4位于低4位进行交换
  53. {
  54. int temp =0;
  55. int i=0;
  56. for (i=0; i<4; i++)
  57. {
  58. temp = data[i+4];
  59. data[i+4] = data[i];
  60. data[i] = temp;
  61. }
  62. }
  63. void SBox(int input[], int output[])  //Sbox操作,结果保存在output中
  64. {
  65. int row,col,value;
  66. row = col = value = 0;      
  67. row = input[0]*2+input[3];    //S0的操作
  68. col = input[1]*2 + input[2];
  69. value = s0[row][col];
  70. output[1] = value % 2;
  71. output[0] = value / 2;
  72. row = input[4]*2 + input[7];   //S1的操作
  73. col = input[5]*2 + input[6];
  74. value = s1[row][col];
  75. output[3] = value % 2;
  76. output[2] = value / 2;
  77. }
  78. long GetFileLength(char filepath[])  //读取文件长度
  79. {
  80. FILE *pFile;
  81. long filelength= 0;
  82. pFile =fopen(filepath, "rb");
  83. if ( pFile== NULL)
  84. return 0;
  85. else
  86. {
  87. fseek(pFile, 0, SEEK_END);
  88. filelength = ftell(pFile);
  89. }
  90. return filelength;
  91. }
  92. void Binary(unsigned char plain,int buff[],int N)     
  93. {// 完成把十进制转化为二进制,N为表示的长度,结果保存在buff中
  94. int i;
  95. for(i=0;i<N;i++)
  96. {
  97. buff[N-i-1]=plain%2;
  98. plain=plain/2;
  99. }
  100. }
  101.  void Dei_Bin(unsigned char *ciphertext,int bin[]) 
  102.  { // 完成把二进制转化为十进制,结果保存在ciphertext中
  103.  
  104.   *ciphertext=bin[0]*128+bin[1]*64+bin[2]*32+bin[3]*16+bin[4]*8+bin[5]*4+bin[6]*2+bin[7];
  105.  }
  106. void Fk(int input[], int subkey[], int output[])   //Fk函数
  107. {
  108. int i;
  109. int right[4] = { 0 };
  110. int out[8] = { 0 };
  111. int out1[4] = { 0 };
  112. for(i=0;i<4;i++)
  113. {
  114. right[i]=input[i+4];
  115. output[i+4] = input[i+4];
  116. }
  117. Permutation(right,out,ep, 8); //EP扩展操作,结果存于out中
  118. XOR(out,subkey,8);  //和Key进行异或操作,结果存于数组out
  119. SBox(out, out1);     //Sbox操作,结果存于out1
  120. Permutation(out1,output,P4,4);  //P4置换,结果存于数组output
  121. XOR(output, input, 4);  
  122. }
  123. int Encryption(char inputfilePath[],char outputfilePath[], char key[], int mode )  //加解密函数
  124. {
  125. FILE *inputfile;
  126. FILE *outputfile;
  127. unsigned char plaint,cipher;
  128. int i;
  129. long filelength = 0;
  130. int inkey[16]={0};
  131. int output[8]={0};
  132. int K1[8]={0};
  133. int buff[8]={0};
  134. int l_ip[5]={0},r_ip[5]={0};
  135. int K2[8]={0};
  136. int out[8]={0};
  137. int ciphertext[8]={0};
  138. char deci_p=0;
  139. plaint = cipher = 0;
  140. inputfile = fopen(inputfilePath, "rb");   //读取文件
  141. if ( inputfile == NULL)
  142. {
  143. printf("The file is not exist");
  144. return 0;
  145. }
  146. outputfile=fopen(outputfilePath,"wb");  //读写文件
  147. if ( outputfile == NULL)
  148. {
  149. printf("The file is not exist");
  150. return 0;
  151. }
  152. Binary(key[0],&inkey[0],8);  
  153. Binary(key[1],&inkey[8],8);
  154. Subkey(inkey, K1,1);  //得到K1
  155. Subkey(inkey, K2,2);  //得到K2
  156. filelength = GetFileLength(inputfilePath);
  157. for(i=0; i<filelength; i++)
  158. {
  159. fread(&plaint, sizeof(unsigned char),1, inputfile);
  160. Binary(plaint,buff,8);  //把十进制转化为二进制,并将结果存于数组buff中
  161. Permutation(buff,out, ip, 8);
  162. if (mode == 0)
  163. Fk(out,K1,output); 
  164. else
  165. Fk(out,K2,output);
  166. swap(output);        
  167. if (mode == 0)
  168. Fk(output, K2,out);
  169. else
  170. Fk(output, K1,out);
  171. Permutation(out,ciphertext, ip_1, 8); //IP逆置换,存于数组ciphertext中
  172. Dei_Bin(&cipher,ciphertext); //将二进制转化为十进制
  173.     fwrite(&cipher, sizeof(unsigned char),1, outputfile);
  174. }
  175. fclose(inputfile);  //关闭文件
  176. fclose(outputfile);
  177.     
  178.   }
  179. int main(int argc,char *argv[])
  180.  {
  181.  
  182. if(argc!=6)
  183.         {
  184. puts("参数是:s-des cipher -e/-d key inputfile outputfile");
  185.             printf("Usage: %s SourceFile TargetFilenTry Againn",argv[0]);
  186.             exit(0);
  187. }
  188. if ( strcmp(argv[2],"-e") ==0)
  189. Encryption(argv[4], argv[5], argv[3], 0);
  190. else
  191. Encryption(argv[4], argv[5], argv[3], 1);
  192.     return 0;
  193.    
  194.  }