openssl des 加密解密


最近在整理关于数据加密解密的资料,整合C/C++、.NET、JAVA三个平台的数据加解密资料,使得三个平台调用相关函数加解密得到的结果都是一致的,兼容的。

ps:最后整理的资料可能会以电子版pdf的形式发出来,如果对您有益,请关注一下。


C/C++是直接使用openssl库的crypte模块进行数据加解密的,下面介绍一下openssl/crypt调用DES进行加解密的过程。代码很容易理解,直接贴代码了:

#include 

#include "evp.h" 

#define BREAK_ERROR(msg){\
    fprintf(stderr,"error break [%s]\n",msg);\
    break;\
}

#define CIPHER_INFO(e){\
    fprintf(stderr,"key_len:[%d]",EVP_CIPHER_CTX_key_length(e));\
    fprintf(stderr,"iv_len :[%d]",EVP_CIPHER_CTX_iv_length(e));\
    fprintf(stderr,"mode:[%d]",EVP_CIPHER_CTX_mode(e));\
    fprintf(stderr,"flag:[%d]\n",EVP_CIPHER_CTX_flags(e));\
}

int test_ecb_des(char *buf1,char *buf2,char *buf3,int *len1,int *len2,int *len3,unsigned char *key){
    int ret = 0,tmplen;
    *len2 = *len3 = tmplen = 0; 

    /* encrypt */
    EVP_CIPHER_CTX ctx;
    EVP_CIPHER_CTX_init(&ctx);
    EVP_EncryptInit_ex(&ctx,EVP_des_ecb(),NULL,key,NULL);
    CIPHER_INFO(&ctx);
    do{
    	if(!EVP_EncryptUpdate(&ctx,buf2,len2,buf1,*len1)){
	    BREAK_ERROR("encryptupdate");
    	}
    	if(!EVP_EncryptFinal_ex(&ctx,buf2+(*len2),&tmplen)){
	    BREAK_ERROR("encryptfinal");
    	}
    }while(0);
    *len2 = *len2 + tmplen;
    EVP_CIPHER_CTX_cleanup(&ctx);
    fprintf(stderr,"encrypt:len1:[%d] len2:[%d]\n",*len1,*len2);

    /* decrypt */
    EVP_CIPHER_CTX ctx_d;
    EVP_CIPHER_CTX_init(&ctx_d);
    EVP_DecryptInit_ex(&ctx_d,EVP_des_ecb(),NULL,key,NULL);
    do{
	if(!EVP_DecryptUpdate(&ctx_d,buf3,len3,buf2,*len2)){
	    BREAK_ERROR("decryptupdate");
    	}
	if(!EVP_DecryptFinal(&ctx_d,buf3+(*len3),&tmplen)){
	    BREAK_ERROR("decryptfinal");
	}
    }while(0);
    *len3 = *len3 + tmplen;
    EVP_CIPHER_CTX_cleanup(&ctx_d);
    fprintf(stderr,"encrypt:len2:[%d] len3:[%d]\n",*len2,*len3);
    /* compare the data */
    if(memcmp(buf1,buf3,*len1) == 0){
	fprintf(stderr,"%s success\n",__func__);
    }else{
	fprintf(stderr,"%s failed\n",__func__);
    }
    return 0;	
}

#define BUF_SIZE 102402
int main(int argc,char ** argv){
    int i,len1,len2,len3;
    unsigned char key_8[] = {0,1,2,3,4,5,6,7};
    unsigned char iv_8[]  = {7,6,5,4,3,2,1,0};
    char * buf1 = (char *)malloc(BUF_SIZE + 1);
    char * buf2 = (char *)malloc(BUF_SIZE + 1);
    char * buf3 = (char *)malloc(BUF_SIZE + 1);
    len1 = len2 = len3 = BUF_SIZE;
    for(i = 0;i< BUF_SIZE;i++){
	buf1[i] = i%256;
    }
    test_ecb_des(buf1,buf2,buf3,&len1,&len2,&len3,key_8);

    return 0;
}
//

//
//上述代码是使用ECB模式加解密的,如果需要跟其他平台或者语言做交换的话,各个平台/语言间的加密模式需要一致,填充方式也需要一致。不得不说的一点是DES已经被破译过,当然这种破译的代价并不低,而且并不是那么简单。如果要求更高的数据安全级别,可以选择使用3DES或者AES等。


以上代码是运行在 openssl-0.9.8zd 版本下通过测试的。不确定是否在openssl所有版本上面都可以运行。在使用是请亲测。

你可能感兴趣的:(C,系统综合,数据安全)