Chinaunix首页 | 论坛 | 博客
  • 博客访问: 137056
  • 博文数量: 26
  • 博客积分: 811
  • 博客等级: 军士长
  • 技术积分: 302
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-15 10:07
文章分类

全部博文(26)

文章存档

2012年(12)

2011年(14)

我的朋友

分类: C/C++

2011-11-17 10:40:04

整理转载自: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 *k = "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 + (8 - 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 (i = 0; i < len; i++)
  64.         {
  65.             printf("0x%.2X ", *(src + i));
  66.         }
  67.         printf("\n");
  68.         /* 循环加密/解密,每8字节一次 */
  69.         count = len / 8;
  70.         for (i = 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 (i = 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. }

阅读(25178) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~