两种3des加密算法的实现

来源:互联网 发布:mac系统管理软件 编辑:程序博客网 时间:2024/05/16 06:54


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;

}