2010-12-17 115 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