两种3des加密算法的实现



int do_encrypt(char * szInput, int nInLen, unsigned char *szOutput)
{
int iOutLen = 0;
        int iTmpLen = 0;        
        char iv[KEY_SIZE] = {0};    
        EVP_CIPHER_CTX ctx;        //初始化,用到什么加密方式由EVP_des_ede3_ecb()决定的,如果改为其他加密方式,只要改这个就可以了。    
        EVP_CIPHER_CTX_init(&ctx);    
        EVP_EncryptInit_ex(&ctx, EVP_des_ede3_ecb(), NULL, (const unsigned char *)sessionid, (const unsigned char *)iv);        //加密    
        if(!EVP_EncryptUpdate(&ctx, (unsigned char*)szOutput, &iOutLen, (const unsigned char *)szInput, nInLen))    
        {        
       EVP_CIPHER_CTX_cleanup(&ctx);        
                return 0;    
        }   //结束加密    
        if(!EVP_EncryptFinal_ex(&ctx, (unsigned char *)(szOutput + iOutLen), &iTmpLen))    
{        
        EVP_CIPHER_CTX_cleanup(&ctx);        
                return 0;    
        }        
        iOutLen += iTmpLen;      
        EVP_CIPHER_CTX_cleanup(&ctx);
        return iOutLen;

}



int do_encrypt(const unsigned char *original, int origlen, unsigned char *encrypter)
{
        int i;
        int len;
        int keylen;
unsigned char block_key[9];
unsigned char tmp[8];
unsigned char key[KEY_SIZE] = {0};
DES_key_schedule ks,ks2,ks3;


        keylen = strlen(sessionid);
        memcpy(key, (const unsigned char *)sessionid, keylen > KEY_SIZE ? KEY_SIZE : keylen);
    
        len = origlen;


        memset(block_key, 0, sizeof(block_key));
        memcpy(block_key, key + 0, 8);
        DES_set_key_unchecked((const_DES_cblock*)block_key, &ks);
        memcpy(block_key, key + 8, 8);
        DES_set_key_unchecked((const_DES_cblock*)block_key, &ks2);
        memcpy(block_key, key + 16, 8);
        DES_set_key_unchecked((const_DES_cblock*)block_key, &ks3);

i = 0;
while(len >= 8){
        DES_ecb3_encrypt((const_DES_cblock*)(original+8*i), (DES_cblock*)(encrypter+8*i), &ks, &ks2, &ks3, DES_ENCRYPT);
len -= 8;
i++;
}

if(len > 0){
    memset(tmp, 0x00, 8);
        memcpy(tmp, original+8*i, len);
        DES_ecb3_encrypt((const_DES_cblock*)tmp, (DES_cblock*)(encrypter+8*i), &ks, &ks2, &ks3, DES_ENCRYPT);
i++;
}

return i*8;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值