最近在整理关于数据加密解密的资料,整合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等。