DES.C
上传用户:zslianheng
上传日期:2013-04-03
资源大小:946k
文件大小:14k
源码类别:

Linux/Unix编程

开发平台:

Visual C++

  1. /* Sofware DES functions
  2.  * written 12 Dec 1986 by Phil Karn, KA9Q; large sections adapted from
  3.  * the 1977 public-domain program by Jim Gillogly
  4.  */
  5. #define NULL 0
  6. #if defined(_M_I86) || defined(WIN32)
  7. #define LITTLE_ENDIAN
  8. #include <stdlib.h> 
  9. #endif
  10. #ifdef WIN32
  11. #define CONSTANT_DATA
  12. #else
  13. #define CONSTANT_DATA __based(__segname("_CODE"))
  14. #endif
  15. //#define register
  16. //#define int short
  17. //#define PERMUTATION
  18. /* Tables defined in the Data Encryption Standard documents */
  19. #ifdef PERMUTATION
  20. /* initial permutation IP */
  21. static char CONSTANT_DATA ip[] = {
  22. 58, 50, 42, 34, 26, 18, 10,  2,
  23. 60, 52, 44, 36, 28, 20, 12,  4,
  24. 62, 54, 46, 38, 30, 22, 14,  6,
  25. 64, 56, 48, 40, 32, 24, 16,  8,
  26. 57, 49, 41, 33, 25, 17,  9,  1,
  27. 59, 51, 43, 35, 27, 19, 11,  3,
  28. 61, 53, 45, 37, 29, 21, 13,  5,
  29. 63, 55, 47, 39, 31, 23, 15,  7
  30. };
  31. /* final permutation IP^-1 */
  32. static char CONSTANT_DATA fp[] = {
  33. 40,  8, 48, 16, 56, 24, 64, 32,
  34. 39,  7, 47, 15, 55, 23, 63, 31,
  35. 38,  6, 46, 14, 54, 22, 62, 30,
  36. 37,  5, 45, 13, 53, 21, 61, 29,
  37. 36,  4, 44, 12, 52, 20, 60, 28,
  38. 35,  3, 43, 11, 51, 19, 59, 27,
  39. 34,  2, 42, 10, 50, 18, 58, 26,
  40. 33,  1, 41,  9, 49, 17, 57, 25
  41. };
  42. #endif
  43. /* expansion operation matrix
  44.  * This is for reference only; it is unused in the code
  45.  * as the f() function performs it implicitly for speed
  46.  */
  47. #ifdef notdef
  48. static char ei[] = {
  49. 32,  1,  2,  3,  4,  5,
  50.  4,  5,  6,  7,  8,  9,
  51.  8,  9, 10, 11, 12, 13,
  52. 12, 13, 14, 15, 16, 17,
  53. 16, 17, 18, 19, 20, 21,
  54. 20, 21, 22, 23, 24, 25,
  55. 24, 25, 26, 27, 28, 29,
  56. 28, 29, 30, 31, 32,  1 
  57. };
  58. #endif
  59. /* permuted choice table (key) */
  60. static char CONSTANT_DATA pc1[] = {
  61. 57, 49, 41, 33, 25, 17,  9,
  62.  1, 58, 50, 42, 34, 26, 18,
  63. 10,  2, 59, 51, 43, 35, 27,
  64. 19, 11,  3, 60, 52, 44, 36,
  65. 63, 55, 47, 39, 31, 23, 15,
  66.  7, 62, 54, 46, 38, 30, 22,
  67. 14,  6, 61, 53, 45, 37, 29,
  68. 21, 13,  5, 28, 20, 12,  4
  69. };
  70. /* number left rotations of pc1 */
  71. static char CONSTANT_DATA totrot[] = {
  72. 1,2,4,6,8,10,12,14,15,17,19,21,23,25,27,28
  73. };
  74. /* permuted choice key (table) */
  75. static char CONSTANT_DATA pc2[] = {
  76. 14, 17, 11, 24,  1,  5,
  77.  3, 28, 15,  6, 21, 10,
  78. 23, 19, 12,  4, 26,  8,
  79. 16,  7, 27, 20, 13,  2,
  80. 41, 52, 31, 37, 47, 55,
  81. 30, 40, 51, 45, 33, 48,
  82. 44, 49, 39, 56, 34, 53,
  83. 46, 42, 50, 36, 29, 32
  84. };
  85. /* The (in)famous S-boxes */
  86. static char CONSTANT_DATA si[8][64] = {
  87. /* S1 */
  88. 14,  4, 13,  1,  2, 15, 11,  8,  3, 10,  6, 12,  5,  9,  0,  7,
  89.  0, 15,  7,  4, 14,  2, 13,  1, 10,  6, 12, 11,  9,  5,  3,  8,
  90.  4,  1, 14,  8, 13,  6,  2, 11, 15, 12,  9,  7,  3, 10,  5,  0,
  91. 15, 12,  8,  2,  4,  9,  1,  7,  5, 11,  3, 14, 10,  0,  6, 13,
  92. /* S2 */
  93. 15,  1,  8, 14,  6, 11,  3,  4,  9,  7,  2, 13, 12,  0,  5, 10,
  94.  3, 13,  4,  7, 15,  2,  8, 14, 12,  0,  1, 10,  6,  9, 11,  5,
  95.  0, 14,  7, 11, 10,  4, 13,  1,  5,  8, 12,  6,  9,  3,  2, 15,
  96. 13,  8, 10,  1,  3, 15,  4,  2, 11,  6,  7, 12,  0,  5, 14,  9,
  97. /* S3 */
  98. 10,  0,  9, 14,  6,  3, 15,  5,  1, 13, 12,  7, 11,  4,  2,  8,
  99. 13,  7,  0,  9,  3,  4,  6, 10,  2,  8,  5, 14, 12, 11, 15,  1,
  100. 13,  6,  4,  9,  8, 15,  3,  0, 11,  1,  2, 12,  5, 10, 14,  7,
  101.  1, 10, 13,  0,  6,  9,  8,  7,  4, 15, 14,  3, 11,  5,  2, 12,
  102. /* S4 */
  103.  7, 13, 14,  3,  0,  6,  9, 10,  1,  2,  8,  5, 11, 12,  4, 15,
  104. 13,  8, 11,  5,  6, 15,  0,  3,  4,  7,  2, 12,  1, 10, 14,  9,
  105. 10,  6,  9,  0, 12, 11,  7, 13, 15,  1,  3, 14,  5,  2,  8,  4,
  106.  3, 15,  0,  6, 10,  1, 13,  8,  9,  4,  5, 11, 12,  7,  2, 14,
  107. /* S5 */
  108.  2, 12,  4,  1,  7, 10, 11,  6,  8,  5,  3, 15, 13,  0, 14,  9,
  109. 14, 11,  2, 12,  4,  7, 13,  1,  5,  0, 15, 10,  3,  9,  8,  6,
  110.  4,  2,  1, 11, 10, 13,  7,  8, 15,  9, 12,  5,  6,  3,  0, 14,
  111. 11,  8, 12,  7,  1, 14,  2, 13,  6, 15,  0,  9, 10,  4,  5,  3,
  112. /* S6 */
  113. 12,  1, 10, 15,  9,  2,  6,  8,  0, 13,  3,  4, 14,  7,  5, 11,
  114. 10, 15,  4,  2,  7, 12,  9,  5,  6,  1, 13, 14,  0, 11,  3,  8,
  115.  9, 14, 15,  5,  2,  8, 12,  3,  7,  0,  4, 10,  1, 13, 11,  6,
  116.  4,  3,  2, 12,  9,  5, 15, 10, 11, 14,  1,  7,  6,  0,  8, 13,
  117. /* S7 */
  118.  4, 11,  2, 14, 15,  0,  8, 13,  3, 12,  9,  7,  5, 10,  6,  1,
  119. 13,  0, 11,  7,  4,  9,  1, 10, 14,  3,  5, 12,  2, 15,  8,  6,
  120.  1,  4, 11, 13, 12,  3,  7, 14, 10, 15,  6,  8,  0,  5,  9,  2,
  121.  6, 11, 13,  8,  1,  4, 10,  7,  9,  5,  0, 15, 14,  2,  3, 12,
  122. /* S8 */
  123. 13,  2,  8,  4,  6, 15, 11,  1, 10,  9,  3, 14,  5,  0, 12,  7,
  124.  1, 15, 13,  8, 10,  3,  7,  4, 12,  5,  6, 11,  0, 14,  9,  2,
  125.  7, 11,  4,  1,  9, 12, 14,  2,  0,  6, 10, 13, 15,  3,  5,  8,
  126.  2,  1, 14,  7,  4, 10,  8, 13, 15, 12,  9,  0,  3,  5,  6, 11
  127. };
  128. /* 32-bit permutation function P used on the output of the S-boxes */
  129. static char CONSTANT_DATA p32i[] = {
  130. 16,  7, 20, 21,
  131. 29, 12, 28, 17,
  132.  1, 15, 23, 26,
  133.  5, 18, 31, 10,
  134.  2,  8, 24, 14,
  135. 32, 27,  3,  9,
  136. 19, 13, 30,  6,
  137. 22, 11,  4, 25
  138. };
  139. /* End of DES-defined tables */
  140. /* Lookup tables initialized once only at startup by desinit() */
  141. static long (*sp_)[64];  /* Combined S and P boxes */
  142. #ifdef PERMUTATION
  143. static char CONSTANT_DATA (*iperm)[16][8]; /* Initial and final permutations */
  144. static char (*fperm)[16][8];
  145. #else
  146. #define iperm 0
  147. #define fperm 0
  148. #endif
  149. /* 8 6-bit subkeys for each of 16 rounds, initialized by setkey() */
  150. static unsigned char (*kn)[8];
  151. /* bit 0 is left-most in byte */
  152. static int CONSTANT_DATA bytebit[] = {
  153. 0200,0100,040,020,010,04,02,01
  154. };
  155. static int CONSTANT_DATA nibblebit[] = {
  156.  010,04,02,01
  157. };
  158. static int desmode;
  159. #ifdef LITTLE_ENDIAN 
  160. /* Byte swap a long */
  161. static
  162. unsigned long
  163. byteswap(unsigned long x)
  164. {
  165. register char *cp,tmp;
  166. cp = (char *)&x;
  167. tmp = cp[3];
  168. cp[3] = cp[0];
  169. cp[0] = tmp;
  170. tmp = cp[2];
  171. cp[2] = cp[1];
  172. cp[1] = tmp;
  173. return x;
  174. }
  175. #endif
  176. #ifdef PERMUTATION
  177. /* initialize a perm array */
  178. static
  179. void perminit(perm,p)
  180. char perm[16][16][8]; /* 64-bit, either init or final */
  181. char p[64];
  182. {
  183. register int l, j, k;
  184. int i,m;
  185. /* Clear the permutation array */
  186. for (i=0; i<16; i++)
  187. for (j=0; j<16; j++)
  188. for (k=0; k<8; k++)
  189. perm[i][j][k]=0;
  190. for (i=0; i<16; i++) /* each input nibble position */
  191. for (j = 0; j < 16; j++)/* each possible input nibble */
  192. for (k = 0; k < 64; k++)/* each output bit position */
  193. {   l = p[k] - 1; /* where does this bit come from*/
  194. if ((l >> 2) != i)  /* does it come from input posn?*/
  195. continue; /* if not, bit k is 0  */
  196. if (!(j & nibblebit[l & 3]))
  197. continue; /* any such bit in input? */
  198. m = k & 07; /* which bit is this in the byte*/
  199. perm[i][j][k>>3] |= bytebit[m];
  200. }
  201. }
  202. #endif
  203. /* Initialize the lookup table for the combined S and P boxes */
  204. static void
  205. spinit()
  206. {
  207. char pbox[32];
  208. int p,i,s,j,rowcol;
  209. long val;
  210. /* Compute pbox, the inverse of p32i.
  211.  * This is easier to work with
  212.  */
  213. for(p=0;p<32;p++){
  214. for(i=0;i<32;i++){
  215. if(p32i[i]-1 == p){
  216. pbox[p] = i;
  217. break;
  218. }
  219. }
  220. }
  221. for(s = 0; s < 8; s++){  /* For each S-box */
  222. for(i=0; i<64; i++){ /* For each possible input */
  223. val = 0;
  224. /* The row number is formed from the first and last
  225.  * bits; the column number is from the middle 4
  226.  */
  227. rowcol = (i & 32) | ((i & 1) ? 16 : 0) | ((i >> 1) & 0xf);
  228. for(j=0;j<4;j++){ /* For each output bit */
  229. if(si[s][rowcol] & (8 >> j)){
  230.  val |= 1L << (31 - pbox[4*s + j]);
  231. }
  232. }
  233. sp_[s][i] = val;
  234. #ifdef DEBUG
  235.                         printf("sp_[%d][%2d] = %08lxn",s,i,sp_[s][i]);
  236. #endif
  237. }
  238. }
  239. }
  240. /* Allocate space and initialize DES lookup arrays
  241.  * mode == 0: standard Data Encryption Algorithm
  242.  * mode == 1: DEA without initial and final permutations for speed
  243.  * mode == 2: DEA without permutations and with 128-byte key (completely
  244.  *       independent subkeys for each round)
  245.  */
  246. int desinit(int mode)
  247. {
  248. if(sp_ != NULL){
  249. /* Already initialized */
  250. return 0;
  251. }
  252. desmode = mode;
  253. if((sp_ = (long (*)[64])malloc(sizeof(long) * 8 * 64)) == NULL){
  254. return -1;
  255. }
  256. spinit();
  257. kn = (unsigned char (*)[8])malloc(sizeof(char) * 8 * 16);
  258. if(kn == NULL){
  259. free((char *)sp_);
  260. return -1;
  261. }
  262. if(mode == 1 || mode == 2) /* No permutations */
  263. return 0;
  264. #ifdef PERMUTATION
  265. iperm = (char (*)[16][8])malloc(sizeof(char) * 16 * 16 * 8);
  266. if(iperm == NULL){
  267. free((char *)sp_);
  268. free((char *)kn);
  269. return -1;
  270. }
  271. perminit(iperm,ip);
  272. fperm = (char (*)[16][8])malloc(sizeof(char) * 16 * 16 * 8);
  273. if(fperm == NULL){
  274. free((char *)sp_);
  275. free((char *)kn);
  276. free((char *)iperm);
  277. return -1;
  278. }
  279. perminit(fperm,fp);
  280. #endif
  281. return 0;
  282. }
  283. /* Free up storage used by DES */
  284. void desdone(void)
  285. {
  286. if(sp_ == NULL)
  287. return; /* Already done */
  288. free((char *)sp_);
  289. free((char *)kn);
  290. #ifdef PERMUTATION
  291. if(iperm != NULL)
  292. free((char *)iperm);
  293. if(fperm != NULL)
  294. free((char *)fperm);
  295. iperm = NULL;
  296. fperm = NULL;
  297. #endif
  298. sp_ = NULL;
  299. kn = NULL;
  300. }
  301. /* Set key (initialize key schedule array) */
  302. void setkey(char *key)
  303. {
  304. char pc1m[56]; /* place to modify pc1 into */
  305. char pcr[56]; /* place to rotate pc1 into */
  306. register int i,j,l;
  307. int m;
  308. /* In mode 2, the 128 bytes of subkey are set directly from the
  309.          * user's key, allowing him to use completely independent
  310.  * subkeys for each round. Note that the user MUST specify a
  311.  * full 128 bytes.
  312.  *
  313.  * I would like to think that this technique gives the NSA a real
  314.          * headache, but I'm not THAT naive.
  315.  */
  316. if(desmode == 2){
  317. for(i=0;i<16;i++)
  318. for(j=0;j<8;j++)
  319. kn[i][j] = *key++;
  320. return;
  321. }
  322. /* Clear key schedule */
  323. for (i=0; i<16; i++)
  324. for (j=0; j<8; j++)
  325. kn[i][j]=0;
  326. for (j=0; j<56; j++) { /* convert pc1 to bits of key */
  327. l=pc1[j]-1; /* integer bit location  */
  328. m = l & 07; /* find bit  */
  329. pc1m[j]=(key[l>>3] & /* find which key byte l is in */
  330. bytebit[m]) /* and which bit of that byte */
  331. ? 1 : 0; /* and store 1-bit result */
  332. }
  333. for (i=0; i<16; i++) { /* key chunk for each iteration */
  334. for (j=0; j<56; j++) /* rotate pc1 the right amount */
  335. pcr[j] = pc1m[(l=j+totrot[i])<(j<28? 28 : 56) ? l: l-28];
  336. /* rotate left and right halves independently */
  337. for (j=0; j<48; j++){ /* select bits individually */
  338. /* check bit that goes to kn[j] */
  339. if (pcr[pc2[j]-1]){
  340.                                 /* mask it in if it's there */
  341. l= j % 6;
  342. kn[i][j/6] |= bytebit[l] >> 2;
  343. }
  344. }
  345. }
  346. }
  347. /* Permute inblock with perm */
  348. static void
  349. permute(inblock,perm,outblock)
  350. char *inblock, *outblock; /* result into outblock,64 bits */
  351. char perm[16][16][8]; /* 2K bytes defining perm. */
  352. {
  353. register int i,j;
  354. register char *ib, *ob;  /* ptr to input or output block */
  355. register char *p, *q;
  356. if(perm == NULL){
  357. /* No permutation, just copy */
  358. for(i=8; i!=0; i--)
  359. *outblock++ = *inblock++;
  360. return;
  361. }
  362. /* Clear output block  */
  363. for (i=8, ob = outblock; i != 0; i--)
  364. *ob++ = 0;
  365. ib = inblock;
  366. for (j = 0; j < 16; j += 2, ib++) { /* for each input nibble */
  367. ob = outblock;
  368. p = perm[j][(*ib >> 4) & 017];
  369. q = perm[j + 1][*ib & 017];
  370. for (i = 8; i != 0; i--){   /* and each output byte */
  371. *ob++ |= *p++ | *q++; /* OR the masks together*/
  372. }
  373. }
  374. }
  375. /* The nonlinear function f(r,k), the heart of DES */
  376. static
  377. long
  378. f(r,subkey)
  379. unsigned long r; /* 32 bits */
  380. unsigned char subkey[8]; /* 48-bit key for this round */
  381. {
  382. register unsigned long rval,rt;
  383. #ifdef TRACE
  384. unsigned char *cp;
  385. int i;
  386.         printf("f(%08lx, %02x %02x %02x %02x %02x %02x %02x %02x) = ",
  387. r,
  388. subkey[0], subkey[1], subkey[2],
  389. subkey[3], subkey[4], subkey[5],
  390. subkey[6], subkey[7]);
  391. #endif
  392. /* Run E(R) ^ K through the combined S & P boxes
  393.  * This code takes advantage of a convenient regularity in
  394.  * E, namely that each group of 6 bits in E(R) feeding
  395.  * a single S-box is a contiguous segment of R.
  396.  */
  397. rt = (r >> 1) | ((r & 1) ? 0x80000000 : 0);
  398. rval = 0;
  399. rval |= sp_[0][((rt >> 26) ^ *subkey++) & 0x3f];
  400. rval |= sp_[1][((rt >> 22) ^ *subkey++) & 0x3f];
  401. rval |= sp_[2][((rt >> 18) ^ *subkey++) & 0x3f];
  402. rval |= sp_[3][((rt >> 14) ^ *subkey++) & 0x3f];
  403. rval |= sp_[4][((rt >> 10) ^ *subkey++) & 0x3f];
  404. rval |= sp_[5][((rt >> 6) ^ *subkey++) & 0x3f];
  405. rval |= sp_[6][((rt >> 2) ^ *subkey++) & 0x3f];
  406. rt = (r << 1) | ((r & 0x80000000) ? 1 : 0);
  407. rval |= sp_[7][(rt ^ *subkey) & 0x3f];
  408. #ifdef TRACE
  409.         printf(" %08lxn",rval);
  410. #endif
  411. return rval;
  412. }
  413. /* Do one DES cipher round */
  414. static void
  415. round(num,block)
  416. int num; /* i.e. the num-th one  */
  417. unsigned long *block;
  418. {
  419. long f();
  420. /* The rounds are numbered from 0 to 15. On even rounds
  421.  * the right half is fed to f() and the result exclusive-ORs
  422.  * the left half; on odd rounds the reverse is done.
  423.  */
  424. if(num & 1){
  425. block[1] ^= f(block[0],kn[num]);
  426. } else {
  427. block[0] ^= f(block[1],kn[num]);
  428. }
  429. }          
  430. /* In-place encryption of 64-bit block */
  431. void endes(char *block)
  432. {
  433. register int i;
  434. unsigned long work[2]; /* Working data storage */
  435. long tmp;
  436. permute(block,iperm,(char *)work); /* Initial Permutation */
  437. #ifdef LITTLE_ENDIAN
  438. work[0] = byteswap(work[0]);
  439. work[1] = byteswap(work[1]);
  440. #endif
  441. /* Do the 16 rounds */
  442. for (i=0; i<16; i++)
  443. round(i,work);
  444. /* Left/right half swap */
  445. tmp = work[0];
  446. work[0] = work[1];
  447. work[1] = tmp;
  448. #ifdef LITTLE_ENDIAN
  449. work[0] = byteswap(work[0]);
  450. work[1] = byteswap(work[1]);
  451. #endif
  452. permute((char *)work,fperm,block); /* Inverse initial permutation */
  453. }
  454. /* In-place decryption of 64-bit block */
  455. void dedes(char *block)
  456. {
  457. register int i;
  458. unsigned long work[2]; /* Working data storage */
  459. long tmp;
  460. permute(block,iperm,(char *)work); /* Initial permutation */
  461. #ifdef LITTLE_ENDIAN
  462. work[0] = byteswap(work[0]);
  463. work[1] = byteswap(work[1]);
  464. #endif
  465. /* Left/right half swap */
  466. tmp = work[0];
  467. work[0] = work[1];
  468. work[1] = tmp;
  469. /* Do the 16 rounds in reverse order */
  470. for (i=15; i >= 0; i--)
  471. round(i,work);
  472. #ifdef LITTLE_ENDIAN
  473. work[0] = byteswap(work[0]);
  474. work[1] = byteswap(work[1]);
  475. #endif
  476. permute((char *)work,fperm,block); /* Inverse initial permutation */
  477. }