使用openssl库实现des,3des加密

整理转载自:http://blog.csdn.net/xuplus/article/details/2607254
主要是调整了一下格式,以及一些变量的类型,以解决在VC2008下无法编译通过的问题。

  1. #include <stdio.h> 
  2. #include <stdlib.h> 
  3. #include <string.h> 
  4. #include <openssl/des.h> 
  5. /************************************************************************ 
  6. ** 本例采用: 
  7. ** 3des-ecb加密方式; 
  8. ** 24位密钥,不足24位的右补0x00; 
  9. ** 加密内容8位补齐,补齐方式为:少1位补一个0x01,少2位补两个0x02,... 
  10. ** 本身已8位对齐的,后面补八个0x08。 
  11. ************************************************************************/ 
  12. int main(void) 
  13. { 
  14.     int docontinue = 1; 
  15.     char *data = "hello world!"; /* 明文 */ 
  16.     int data_len; 
  17.     int data_rest; 
  18.     unsigned char ch; 
  19.     unsigned char *src = NULL; /* 补齐后的明文 */ 
  20.     unsigned char *dst = NULL; /* 解密后的明文 */ 
  21.     int len; 
  22.     unsigned char tmp[8]; 
  23.     unsigned char in[8]; 
  24.     unsigned char out[8]; 
  25.     char *= "01234567899876543210"; /* 原始密钥 */ 
  26.     int key_len; 
  27.     #define LEN_OF_KEY 24 
  28.     unsigned char key[LEN_OF_KEY]; /* 补齐后的密钥 */ 
  29.     unsigned char block_key[9]; 
  30.     DES_key_schedule ks,ks2,ks3; 
  31.     /* 构造补齐后的密钥 */ 
  32.     key_len = strlen(k); 
  33.     memcpy(key, k, key_len); 
  34.     memset(key + key_len, 0x00, LEN_OF_KEY - key_len); 
  35.     /* 分析补齐明文所需空间及补齐填充数据 */ 
  36.     data_len = strlen(data); 
  37.     data_rest = data_len % 8; 
  38.     len = data_len + (- data_rest); 
  39.     ch = 8 - data_rest; 
  40.     src = (unsigned char *)malloc(len); 
  41.     dst = (unsigned char *)malloc(len); 
  42.     if (NULL == src || NULL == dst) 
  43.     { 
  44.         docontinue = 0; 
  45.     } 
  46.     if (docontinue) 
  47.     { 
  48.         int count; 
  49.         int i; 
  50.         /* 构造补齐后的加密内容 */ 
  51.         memset(src, 0, len); 
  52.         memcpy(src, data, data_len); 
  53.         memset(src + data_len, ch, 8 - data_rest); 
  54.         /* 密钥置换 */ 
  55.         memset(block_key, 0, sizeof(block_key)); 
  56.         memcpy(block_key, key + 0, 8); 
  57.         DES_set_key_unchecked((const_DES_cblock*)block_key, &ks); 
  58.         memcpy(block_key, key + 8, 8); 
  59.         DES_set_key_unchecked((const_DES_cblock*)block_key, &ks2); 
  60.         memcpy(block_key, key + 16, 8); 
  61.         DES_set_key_unchecked((const_DES_cblock*)block_key, &ks3); 
  62.         printf("before encrypt:\n"); 
  63.         for (= 0; i < len; i++) 
  64.         { 
  65.             printf("0x%.2X ", *(src + i)); 
  66.         } 
  67.         printf("\n"); 
  68.         /* 循环加密/解密,每8字节一次 */ 
  69.         count = len / 8; 
  70.         for (= 0; i < count; i++) 
  71.         { 
  72.             memset(tmp, 0, 8); 
  73.             memset(in, 0, 8); 
  74.             memset(out, 0, 8); 
  75.             memcpy(tmp, src + 8 * i, 8); 
  76.             /* 加密 */ 
  77.             DES_ecb3_encrypt((const_DES_cblock*)tmp, (DES_cblock*)in, &ks, &ks2, &ks3, DES_ENCRYPT); 
  78.             /* 解密 */ 
  79.             DES_ecb3_encrypt((const_DES_cblock*)in, (DES_cblock*)out, &ks, &ks2, &ks3, DES_DECRYPT);
  80.             /* 将解密的内容拷贝到解密后的明文 */ 
  81.             memcpy(dst + 8 * i, out, 8); 
  82.         } 
  83.         printf("after decrypt :\n"); 
  84.         for (= 0; i < len; i++) 
  85.         { 
  86.             printf("0x%.2X ", *(dst + i)); 
  87.         } 
  88.         printf("\n"); 
  89.     } 
  90.     if (NULL != src) 
  91.     { 
  92.         free(src);
  93.         src = NULL; 
  94.     } 
  95.     if (NULL != dst) 
  96.     { 
  97.         free(dst); 
  98.         dst = NULL; 
  99.     } 
  100.     return 0; 
  101. }

你可能感兴趣的:(C/C++,linux)