C基本编程概念

C基本编程概念,c,C,我是C编程新手,我正在编写一个程序来进行3DES加密 但是这段代码中有一些基本错误,比如在函数中执行malloc,而不是取消分配。有人能帮我用一个全局变量重写这个,然后释放吗?我想优化这段代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <openssl/des.h> #include <openssl/rand.h> #define BUFS

我是C编程新手,我正在编写一个程序来进行3DES加密

但是这段代码中有一些基本错误,比如在函数中执行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[]="1234567890123456"; // 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);
}
#包括
#包括
#包括
#包括
#包括
#定义BUFSIZE 128
煤焦*
加密(字符*密钥、字符*消息、整数大小)
{
静态字符*Res;
未签名字符输入[BUFSIZE],输出[BUFSIZE],返回[BUFSIZE];
无符号字符*e=out;
字符缓冲区[21]=“”;
char*pbuffer=缓冲区;
内伦;
DES_cblock键1、键2、键3;
DES_cblock seed={0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10};
DES_cblock ivsetup={0xE1、0xE2、0xE3、0xD4、0xD5、0xC6、0xC7、0xA8};
依维柯大学;
附件ks1、ks2、ks3;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(back,0,sizeof(back));
DES_string_至_键(键和键1);
DES_string_至_键(键和键2);
DES_string_至_键(键和键3);
DES_set_键((C_块*)键1和ks1);
DES_set_键((C_块*)键2和ks2);
DES_set_键((C_块*)键3和ks3);
strcpy(in,Msg);
//printf(“在加密中,明文:[%s]\n”,在中);
len=strlen(英寸);
memcpy(ivec、ivsetup、sizeof(ivsetup));
DES_ede3_cbc_encrypt(输入、输出、len、&ks1、&ks2、&ks3、&ivec、DES_encrypt);
//printf(“在加密中,密文:”);
而(*e)
{
//printf(“%02x”,*e);
sprintf(pbuffer,%02x,*e);
pbuffer+=2;
*e++;
}
//printf(“\n”);
//printf(“在加密中,返回文本:[%s]\n”,缓冲区);
Res=(char*)malloc(sizeof(buffer));
memcpy(Res,buffer,sizeof(buffer));
返回((无符号字符*)Res);
}
煤焦*
解密(字符*密钥、字符*消息、整数大小)
{
静态字符*Res;
未签名字符输入[BUFSIZE],输出[BUFSIZE],返回[BUFSIZE];
无符号字符*e=out;
字符缓冲区[21]=“”;
char*pbuffer=缓冲区;
内伦;
DES_cblock键1、键2、键3;
DES_cblock seed={0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10};
DES_cblock ivsetup={0xE1、0xE2、0xE3、0xD4、0xD5、0xC6、0xC7、0xA8};
依维柯大学;
附件ks1、ks2、ks3;
memset(in,0,sizeof(in));
memset(out,0,sizeof(out));
memset(back,0,sizeof(back));
DES_string_至_键(键和键1);
DES_string_至_键(键和键2);
DES_string_至_键(键和键3);
DES_set_键((C_块*)键1和ks1);
DES_set_键((C_块*)键2和ks2);
DES_set_键((C_块*)键3和ks3);
strcpy(in,Msg);
//printf(“在解密中,明文:[%s]\n”,在中);
len=strlen(英寸);
memcpy(ivec、ivsetup、sizeof(ivsetup));
DES_ede3_cbc_encrypt(输入、输出、len、&ks1、&ks2、&ks3、&ivec、DES_DECRYPT);
//printf(“在解密中,密文:”);
而(*e)
{
//printf(“%02x”,*e);
sprintf(pbuffer,%02x,*e);
pbuffer+=2;
*e++;
}
//printf(“\n”);
//printf(“在解密中,返回文本:[%s]\n”,缓冲区);
Res=(char*)malloc(sizeof(buffer));
memcpy(Res,buffer,sizeof(buffer));
返回((无符号字符*)Res);
}
内部主(空)
{
字符键[]=“1234567890123456”;//16
字符清除[]=“Arun Das”;
字符*解密;
字符*加密;
printf(“在主目录中,纯文本\t:%s\n”,清除);
加密=加密(密钥,清除,sizeof(清除));
解密=解密(密钥,加密,sizeof(加密));
printf(“主要是加密文本\t:%s\n”,加密);
printf(“主要是解密文本\t:%s\n”,已解密);
系统(“暂停”);
出口(0);
}

不要使用全局变量-一旦调用代码(
main()
)完成了结果,就在返回的指针上使用
free()


您的实现非常好-这两个函数都分配内存并将其所有权传递给调用代码。调用代码负责释放该内存。这是简明扼要的。引入全局变量会使情况变得更糟


可以这样想-
malloc()
也会这样做(除了它分配内存而不填充内存)。怎么能
malloc()
调用代码可以访问全局变量,这样做更清楚吗?

您确实需要正确格式化代码…引入全局变量来帮助管理内存不是一个好主意。@TToni:我只是为其他人做这件事,我不知道C…是的…我知道那个已测试的库..但这似乎是要求……:)所以我必须做免费的(加密的)和类似的解密是不是>?@Arun Abraham:是的,但只有在你做了那些
printf()
s之后。只是我不知道我在哪里可以做dealloc…这就是为什么…做免费的(加密的)就足够了吗???@Arun Abraham你必须释放你分配的所有内存。由于
Encrypt()
Decrypt()
都返回指向已分配内存的指针,因此必须
free()
加密
解密
。free(加密);免费(解密);在printf之后添加了这两行。。这应该考虑到内存分配权。。。