unsigned char*
tripleDes(const unsigned char *src,int src_len,const unsigned char *key,const unsigned char *iv, int*len,TRIPLE_DES_CRYPTO flag){
if (strlen((const char *)key)!=24) {
return NULL;
}
EVP_CIPHER_CTX ctx;
EVP_CIPHER_CTX_init(&ctx);
if (iv==NULL) { //if iv is null will write a default 'init Vec'
unsigned char new_iv[]={'i','n','i','t',' ','V','e','c'};
iv = new_iv;
}
if (flag == TRIPLE_DES_ENCRYPT) {
int err = EVP_EncryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL, key, iv);
err = EVP_CIPHER_CTX_set_padding(&ctx, 0x0001|0x0002);
if (err<=0) {
return NULL;
}
//warning:special character may get an error!
int c_len = 0;
//calc the 3des output len 8 multiple,be careful multi 2
int c_po_len = (src_len + 8) & ~(8 - 1);
unsigned char *cipher_t = (unsigned char *)malloc(c_po_len * sizeof(char));
memset((void *)cipher_t, 0x0, c_po_len);
err = EVP_EncryptUpdate(&ctx, cipher_t, &c_len, src, src_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
int f_len = 0;
err = EVP_EncryptFinal_ex(&ctx, cipher_t+c_len, &f_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
EVP_CIPHER_CTX_cleanup(&ctx);
*len=c_len+f_len;
return cipher_t;
}
else if (flag == TRIPLE_DES_DECRYPT) {
int err = EVP_DecryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL, key, iv);
err = EVP_CIPHER_CTX_set_padding(&ctx, 0x0001|0x0002);
if (err<=0) {
return NULL;
}
//warning:special character may get an error!
int c_len = 0;
//calc the 3des output len 8 multiple
int c_po_len = (src_len + 8) & ~(8 - 1);
unsigned char *cipher_t = (unsigned char *)malloc(c_po_len*sizeof(char));
memset((void *)cipher_t, 0, c_po_len);
err = EVP_DecryptUpdate(&ctx, cipher_t, &c_len, src, src_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
int f_len=0;
err = EVP_DecryptFinal_ex(&ctx, cipher_t+c_len, &f_len);
if (err<=0) {
free(cipher_t);
return NULL;
}
EVP_CIPHER_CTX_cleanup(&ctx);
*len = c_len+f_len;
cipher_t[*len] = '\0';
return cipher_t;
}
EVP_CIPHER_CTX_cleanup(&ctx);
return NULL;
}