⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 des.c

📁 ansiX9.8 算法的C语言实现,同时包含DES算法的C语言实现
💻 C
字号:
/*	DES加密, 解密程序	作者: 卢旭潮	时间: 1997.8.31*/#include <stdio.h>#include <stdlib.h>static void conv_8to64(const unsigned char *src, unsigned char *dst){  int i, j;  unsigned char *ptr = dst;  for (i = 0; i < 8; i++)	 for (j = 0; j < 8; j++)		*ptr++ = (src[i] >> (7 - j)) & 0x01;}static void IP(const unsigned char *src, unsigned char *dst){  int i;  unsigned char IP_table[] = {	 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  };  for (i = 0; i < 64; i++)	 dst[i] = src[IP_table[i]];}static void PC_1(const unsigned char *src, unsigned char *dst){  int i;  unsigned char PC_table[] = {    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  };  for (i = 0; i < 56; i++)	 dst[i] = src[PC_table[i]];}static void LS(unsigned char *data, unsigned char num){  unsigned char i, temp, j;  unsigned char temp1;  if (num == 1) {	 temp = data[0];	 for (i = 0; i < 27; i++)		data[i] = data[i+1];	 data[27] = temp;  }  else {	 temp = data[0];	 temp1 = data[1];	 for (i = 0; i < 26; i++)		data[i] = data[i+2];	 data[26] = temp;	 data[27] = temp1;  }/*  for (j = 0; j < num; j++) {	 temp = data[0];	 for (i = 0; i < 27; i++)		data[i] = data[i+1];	 data[27] = temp;  }*/}static void PC_2(unsigned char *src, unsigned char *dst){  int i;  unsigned char PC2_table[] = {	 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, 47,    43, 48, 38, 55, 33, 52,    45, 41, 49, 35, 28, 31  };  for (i = 0; i < 48; i++)    dst[i] = src[PC2_table[i]];}static void get_key(const unsigned char *src, unsigned char dst[16][48]){  unsigned char buf[64], buf1[56];  int i;  unsigned char num;  conv_8to64(src, buf);  /* 排列选择1 */  PC_1(buf, buf1);  for (i = 0; i < 16; i++) {    if (i == 0 || i == 1 || i == 8 || i == 15)      num = 1;    else      num = 2;    /* 循环左移 */    LS(buf1,  num);    LS(buf1+28,  num);    /* 排列选择2 */    PC_2(buf1, dst[i]);  }}static void expand(unsigned char *src, unsigned char *dst){  int i;  unsigned char E_table[] = {    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  };  for (i = 0; i < 48; i++)    dst[i] = src[E_table[i]];}static void do_xor(unsigned char *src1, unsigned char *src2, int num){  int i;  for (i = 0; i < num; i++)	 src1[i] ^= src2[i];}static void compress(unsigned char *data){  int i, j, k;  unsigned char buf[48], ch;  unsigned char S_box[8][4][16] = {    {{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}    },    {{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}    },    {{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}	 },	 {{ 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}    },    {{ 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}    },    {{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}    },    {{ 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}	 },	 {{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}    }  };  memcpy(buf, data, 48);  for (i = 0; i < 8; i++) {	 j = (buf[6*i] << 1) | buf[6*i+5];	 k = (buf[6*i+1] << 3) | (buf[6*i+2] << 2) | (buf[6*i+3] << 1) | buf[6*i+4];	 ch = S_box[i][j][k];	 data[4*i] = (ch >> 3) & 0x01;    data[4*i+1] = (ch >> 2) & 0x01;    data[4*i+2] = (ch >> 1) & 0x01;    data[4*i+3] = ch & 0x01;  }}static void P_sort(unsigned char *data){  unsigned char buf[32];  int i;  unsigned char P_table[] = {    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  };  memcpy(buf, data, 32);  for (i = 0; i < 32; i++)    data[i] = buf[P_table[i]];}static void IP_1(unsigned char *src, unsigned char *dst){  int i;  unsigned char RIP_table[] = {    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  };  for (i = 0; i < 64; i++)    dst[i] = src[RIP_table[i]];}static void conv_64to8(unsigned char *src, unsigned char *dst){  int i, j;  memset(dst, 0, 8);  for (i = 0; i < 8; i++) {    for (j = 0; j < 8; j++) {		dst[i] |= src[8*i+j] << (7-j);    }  }}//************************************************************************// 函数名: DES// 功能  : 标准DES算法// 参数  : src: 原码, dst: 目标码, key: 加密的密钥//          flag:  'D'或'd': 解密, 'E' 或 'e': 加密// 时间:   1998.3.24//------------------------------------------------------------------------void DES(const unsigned char *src, unsigned char *dst, const unsigned char *key, unsigned char flag){  unsigned char buf[64], buf1[64];  unsigned char kbuf[16][48];  int           i;  /* 得到16个密钥 */  get_key(key, kbuf);  conv_8to64(src, buf);  /* 第一步: 初始排序IP(Initial Permutation), 目的是将明文的顺序打乱 */  IP(buf, buf1);  /* 第二步: 乘积变换, 为DES算法的核心 */  for (i = 0; i < 16; i++) {    /* 扩展置换, 把32位扩展为48位 */    expand(buf1+32, buf);	 /* 与子密钥进行异或 */    if (flag == 'e' || flag == 'E')      do_xor(buf, kbuf[i], 48);    else      do_xor(buf, kbuf[15-i], 48);    /* 压缩代换, 48位变换为32位 */    compress(buf);    /* P排列 */    P_sort(buf);	 do_xor(buf, buf1, 32);    memcpy(buf1, buf1+32, 32);    memcpy(buf1+32, buf, 32);  }  /* 第三步: 最终排列 */  memcpy(buf, buf1+32, 32);  memcpy(buf+32, buf1, 32);  IP_1(buf, buf1);  conv_64to8(buf1, dst);}//************************************************************************// 函数名: DoMac // 功能  : X9.9 MAC算法// 参数  : strMacBuf: 参与MAC的数据 //          nLen:  MACBUF 的长度 //          strMac: MAC值 (8 bytes) //          strKey: KEY值 (8 bytes) // 时间:   2000.3.30 //------------------------------------------------------------------------int DoMac(strMacBuf, nLen, strMac, strKey)unsigned char *strMacBuf, *strMac, *strKey;int    nLen;{    int i;    unsigned char tmp[8];    memset(strMac, 0, 8);    for(i = 0; i < nLen / 8; i++ ) {      do_xor(strMac, strMacBuf+i*8, 8);      DES(strMac, tmp, strKey, 'E');       memcpy(strMac, tmp, 8);    }    if (nLen-i*8 > 0) {       do_xor(strMac, strMacBuf+i*8, nLen-i*8);      DES(strMac, tmp, strKey, 'E');       memcpy(strMac, tmp, 8);    }    return(0);}//************************************************************************// 函数名: DoMacSimple // 功能  : 先以八字节为单位进行异或,最后做DES。 // 参数  : strMacBuf: 参与MAC的数据 //          nLen:  MACBUF 的长度 //          strMac: MAC值 (8 bytes) //          strKey: KEY值 (8 bytes) // 时间:   2000.8.12 //------------------------------------------------------------------------int DoMacSimple(strMacBuf, nLen, strMac, strKey)unsigned char *strMacBuf, *strMac, *strKey;int    nLen;{    int i;    unsigned char tmp[8];    memset(strMac, 0, 8);    for(i = 0; i < nLen / 8; i++ ) {      do_xor(strMac, strMacBuf+i*8, 8);    }    if (nLen-i*8 > 0) {       do_xor(strMac, strMacBuf+i*8, nLen-i*8);    }/*  fprintf(stderr, "Before Mac: ");for (i = 0; i < 8; i++)  fprintf(stderr, "%02x.", strMac[i]);fprintf(stderr, "\n");*/    DES(strMac, tmp, strKey, 'E');     memcpy(strMac, tmp, 8);/*  fprintf(stderr, "After Mac: ");for (i = 0; i < 8; i++)  fprintf(stderr, "%02x.", strMac[i]);fprintf(stderr, "\n");*/    return(0);}void  HostDes(card_no, work_key, pin, encrypt_pin, flag)unsigned char *card_no, *work_key, *pin, *encrypt_pin, flag;{   unsigned char  card_buf[16], pin_buf[17], enpin_buf[8];   unsigned char  key_buf[8];   int   i, ii;   DspToHex(work_key, key_buf, 8);/*   memset(card_buf, 'F', sizeof(card_buf));   memcpy(card_buf, card_no+1, 15);   DspToHex(card_buf, card_buf, 8);   card_buf[0] = 0;*/   memset(card_buf, 0, sizeof(card_buf));    memcpy(card_buf+1, card_no+strlen(card_no)-13, 12);   DspToHex(card_buf+1, card_buf+1, 6);   card_buf[0] = 0;   if(flag == 'e' || flag == 'E')   {       enpin_buf[0] = strlen(pin);       memcpy(pin_buf, pin, strlen(pin));       ii = strlen(pin);       for(i = ii; i<17; i++)       {	  pin_buf[i] = 'F';       }       DspToHex(pin_buf, pin_buf, 8);       do_xor(card_buf, pin_buf, 7);       memcpy(enpin_buf+1, card_buf, 7);for (i = 0; i < 8; i++)  fprintf(stderr, "%02x.", enpin_buf[i]);fprintf(stderr, "\n");       DES(enpin_buf, encrypt_pin, key_buf, 'E');       return;   }   if(flag == 'd' || flag == 'D' )   {       DES(encrypt_pin, pin_buf, key_buf, 'D');       do_xor(pin_buf+1, card_buf, 7);       HexToDsp(pin_buf+1, pin, 7);       pin[pin_buf[0]&0x0f] = 0;       return;   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -