涨停跟庄战法:使用openssl库实现des&&3des加密 - lyjinger的专栏...

来源:百度文库 编辑:中财网 时间:2024/05/11 01:46:22
  1. #include  
  2. #include  
  3. #include  
  4. #include  
  5. /************************************************************************ 
  6. ** 本例采用: 
  7. ** 3des-ecb加密方式; 
  8. ** 24位密钥,不足24位的右补0x00; 
  9. ** 加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,... 
  10. ** 本身已8位对齐的,后面补八个0x08。 
  11. ************************************************************************/ 
  12. int main(void) 

  13.     int docontinue = 1; 
  14.     char *data = "hello world!"; /* 明文 */ 
  15.     int data_len; 
  16.     int data_rest; 
  17.     unsigned char ch; 
  18.     unsigned char *src = NULL; /* 补齐后的明文 */ 
  19.     unsigned char *dst = NULL; /* 解密后的明文 */ 
  20.     int len; 
  21.     unsigned char tmp[8]; 
  22.     unsigned char in[8]; 
  23.     unsigned char out[8]; 
  24.     char *k = "01234567899876543210"; /* 原始密钥 */ 
  25.     int key_len; 
  26.     #define LEN_OF_KEY 24 
  27.     unsigned char key[LEN_OF_KEY]; /* 补齐后的密钥 */ 
  28.     unsigned char block_key[9]; 
  29.     DES_key_schedule ks,ks2,ks3; 
  30.     /* 构造补齐后的密钥 */ 
  31.     key_len = strlen(k); 
  32.     memcpy(key, k, key_len); 
  33.     memset(key + key_len, 0x00, LEN_OF_KEY - key_len); 
  34.     /* 分析补齐明文所需空间及补齐填充数据 */ 
  35.     data_len = strlen(data); 
  36.     data_rest = data_len % 8; 
  37.     len = data_len + (8 - data_rest); 
  38.     ch = 8 - data_rest; 
  39.     src = (unsigned char *)malloc(len); 
  40.     dst = (unsigned char *)malloc(len); 
  41.     if (NULL == src || NULL == dst) 
  42.     { 
  43.         docontinue = 0; 
  44.     } 
  45.     if (docontinue) 
  46.     { 
  47.         int count; 
  48.         int i; 
  49.         /* 构造补齐后的加密内容 */ 
  50.         memset(src, 0, len); 
  51.         memcpy(src, data, data_len); 
  52.         memset(src + data_len, ch, 8 - data_rest); 
  53.         /* 密钥置换 */ 
  54.         memset(block_key, 0, sizeof(block_key)); 
  55.         memcpy(block_key, key + 0, 8); 
  56.         DES_set_key_unchecked((const_DES_cblock*)block_key, &ks); 
  57.         memcpy(block_key, key + 8, 8); 
  58.         DES_set_key_unchecked((const_DES_cblock*)block_key, &ks2); 
  59.         memcpy(block_key, key + 16, 8); 
  60.         DES_set_key_unchecked((const_DES_cblock*)block_key, &ks3); 
  61.         printf("before encrypt:\n"); 
  62.         for (i = 0; i < len; i++) 
  63.         { 
  64.             printf("0x%.2X ", *(src + i)); 
  65.         } 
  66.         printf("\n"); 
  67.         /* 循环加密/解密,每8字节一次 */ 
  68.         count = len / 8; 
  69.         for (i = 0; i < count; i++) 
  70.         { 
  71.             memset(tmp, 0, 8); 
  72.             memset(in, 0, 8); 
  73.             memset(out, 0, 8); 
  74.             memcpy(tmp, src + 8 * i, 8); 
  75.             /* 加密 */ 
  76.             DES_ecb3_encrypt((const_DES_cblock*)tmp, (DES_cblock*)in, &ks, &ks2, &ks3, DES_ENCRYPT); 
  77.             /* 解密 */ 
  78.             DES_ecb3_encrypt((const_DES_cblock*)in, (DES_cblock*)out, &ks, &ks2, &ks3, DES_DECRYPT);
  79.             /* 将解密的内容拷贝到解密后的明文 */ 
  80.             memcpy(dst + 8 * i, out, 8); 
  81.         } 
  82.         printf("after decrypt :\n"); 
  83.         for (i = 0; i < len; i++) 
  84.         { 
  85.             printf("0x%.2X ", *(dst + i)); 
  86.         } 
  87.         printf("\n"); 
  88.     } 
  89.     if (NULL != src) 
  90.     { 
  91.         free(src);
  92.         src = NULL; 
  93.     } 
  94.     if (NULL != dst) 
  95.     { 
  96.         free(dst); 
  97.         dst = NULL; 
  98.     } 
  99.     return 0; 
  100. }
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyjinger/archive/2007/08/02/1722570.aspx