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;
}