2010-12-17 113 views
2

我是C编程新手,我正在编写3DES加密程序。C基本编程概念

但是在这段代码中有一些基本的错误,比如在函数中做malloc而不是释放。有人可以帮我通过使用一个全局变量重写这个,然后释放?我想优化这段代码。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <openssl/des.h> 
#include <openssl/rand.h> 

#define BUFSIZE 128 


char * 
Encrypt(char *Key, char *Msg, int size) 
{ 

     static char* Res; 
     unsigned char in[BUFSIZE], out[BUFSIZE], back[BUFSIZE]; 
     unsigned char *e = out; 
     char buffer[21]=""; 
     char *pbuffer = buffer; 
     int len; 

     DES_cblock key1, key2, key3; 
     DES_cblock seed = {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}; 
     DES_cblock ivsetup = {0xE1, 0xE2, 0xE3, 0xD4, 0xD5, 0xC6, 0xC7, 0xA8}; 
     DES_cblock ivec; 
     DES_key_schedule ks1, ks2, ks3; 

     memset(in, 0, sizeof(in)); 
     memset(out, 0, sizeof(out)); 
     memset(back, 0, sizeof(back)); 

     DES_string_to_key (Key, &key1); 
     DES_string_to_key (Key, &key2); 
     DES_string_to_key (Key, &key3); 

     DES_set_key((C_Block *)key1, &ks1); 
     DES_set_key((C_Block *)key2, &ks2); 
     DES_set_key((C_Block *)key3, &ks3); 

     strcpy(in, Msg); 

     //printf("In Encrypt, Plaintext: [%s]\n", in); 

     len = strlen(in); 
     memcpy(ivec, ivsetup, sizeof(ivsetup)); 
     DES_ede3_cbc_encrypt(in, out, len, &ks1, &ks2, &ks3, &ivec, DES_ENCRYPT); 

     //printf("In Encrypt, Ciphertext:"); 
     while (*e) 
     { 
      //printf("%02x", *e); 
      sprintf(pbuffer, "%02x", *e); 
      pbuffer +=2; 
      *e++; 
     } 
     //printf("\n"); 
     //printf("In Encrypt, Returning Text: [%s]\n", buffer); 

     Res = (char *) malloc(sizeof(buffer)); 
     memcpy(Res, buffer, sizeof(buffer)); 
     return((unsigned char *)Res); 
} 

char * 
Decrypt(char *Key, char *Msg, int size) 
{ 

     static char* Res; 

     unsigned char in[BUFSIZE], out[BUFSIZE], back[BUFSIZE]; 
     unsigned char *e = out; 
     char buffer[21] = ""; 
     char *pbuffer = buffer; 
     int len; 

     DES_cblock key1, key2, key3; 
     DES_cblock seed = {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10}; 
     DES_cblock ivsetup = {0xE1, 0xE2, 0xE3, 0xD4, 0xD5, 0xC6, 0xC7, 0xA8}; 
     DES_cblock ivec; 
     DES_key_schedule ks1, ks2, ks3; 

     memset(in, 0, sizeof(in)); 
     memset(out, 0, sizeof(out)); 
     memset(back, 0, sizeof(back)); 

     DES_string_to_key (Key, &key1); 
     DES_string_to_key (Key, &key2); 
     DES_string_to_key (Key, &key3); 

     DES_set_key((C_Block *)key1, &ks1); 
     DES_set_key((C_Block *)key2, &ks2); 
     DES_set_key((C_Block *)key3, &ks3); 

     strcpy(in, Msg); 

     //printf("In Decrypt, Plaintext: [%s]\n", in); 

     len = strlen(in); 
     memcpy(ivec, ivsetup, sizeof(ivsetup)); 
     DES_ede3_cbc_encrypt(in, out, len, &ks1, &ks2, &ks3, &ivec, DES_DECRYPT); 

     //printf("In Decrypt, Ciphertext:"); 
     while (*e) 
     { 
      //printf("%02x", *e); 
      sprintf(pbuffer, "%02x", *e); 
      pbuffer +=2; 
      *e++; 
     } 
     //printf("\n"); 
     //printf("In Decrypt, Returning Text: [%s]\n", buffer); 

     Res = (char *) malloc(sizeof(buffer)); 
     memcpy(Res, buffer, sizeof(buffer)); 
     return((unsigned char *)Res); 
} 

int main(void) 
{ 
    char key[]="123456789"; // 16 
    char clear[]="Arun Das"; 
    char *decrypted; 
    char *encrypted; 

    printf("In Main, Plain text\t : %s \n",clear); 
    encrypted=Encrypt(key,clear,sizeof(clear)); 
    decrypted=Decrypt(key,encrypted,sizeof(encrypted)); 
    printf("In Main, Encrypted text\t : %s \n",encrypted); 
    printf("In Main, Decrypted text\t : %s \n",decrypted); 
    system("PAUSE"); 
    exit(0); 
} 
+1

你真的需要正确格式化你的代码... – 2010-12-17 10:41:45

+4

引入一个全局变量来帮助管理内存不是一个好主意。 – pmg 2010-12-17 10:43:52

+0

@TToni:我只是在为别人做这件事,而我没有C的线索......是的......我测试了lib ..但是这似乎是要求...... :) – 2010-12-17 10:56:27

回答

3

不要使用全局变量 - 而不是在返回指针一旦调用代码(main())与结果进行使用free()

你的实现是相当不错的 - 两个函数分配内存和将它的所有权传递给调用代码。调用代码负责释放该内存。这简洁明了。引入全局变量会使情况变得更糟。

想想这样 - malloc()也是这样(除了分配内存并且不填充它)。 malloc()怎么可以用调用代码可访问的全局变量来更清晰地完成?

+0

所以我将不得不做免费(加密)和类似的解密是>? – 2010-12-17 10:47:02

+0

@Arun Abraham:是的,但是只有在你完成这些'printf()之后。 – sharptooth 2010-12-17 10:48:12

+0

这只是我不知道我在哪里可以做dealloc ......这就是为什么......做免费(加密)就够了吗? – 2010-12-17 10:50:00