3DES Jni

来源:互联网 发布:桌面图标整理软件下载 编辑:程序博客网 时间:2024/05/01 21:03


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

    }

0 0
原创粉丝点击