您的位置:首页 > 其它

3DES Jni

2015-07-30 11:26 295 查看
具体算法原理
http://baike.baidu.com/view/350958.htm
具体实现

3des 的输入参数需要长度24 的key 和 长度为8的iv(通常情况可以默认某个常量)

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: