3DES Jni



具体算法原理
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;

    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值