#include
#include
#include
#include
#include
int des_encrypt(const char *clearText, unsigned char **cipherText, const char *key)
{
DES_cblock keyEncrypt;
DES_key_schedule keySchedule;
const_DES_cblock inputText;
DES_cblock outputText;
DES_cblock *iv3;
char *tmp;
unsigned char *buf;
int len = strlen(key);
int ret = 0;
int i, j;
memset(&keyEncrypt, 0x00, sizeof(keyEncrypt));
memset(keyEncrypt, 0x00, 8);
//构造补齐后的密钥
if(len <= 8)
{
memcpy(keyEncrypt, key, len);
}
else
{
memcpy(keyEncrypt, key, 8);
}
//密钥置换
DES_set_key_unchecked(&keyEncrypt, &keySchedule);
len = strlen(clearText) / 8;
if(strlen(clearText) % 8 == 0)
{
ret = len;
tmp = malloc(len*8*sizeof(unsigned char));
iv3 = malloc(len*8*sizeof(unsigned char));
buf = malloc(len*8*sizeof(unsigned char));
memset(tmp, 0x00, len*8);
memset(iv3, 0x00, len*8);
memset(buf, 0x00, len*8);
memcpy(tmp, clearText, len*8);
strcpy((char *)iv3, "00000000");
}
else
{
ret = len + 1;
i = strlen(clearText) % 8;
tmp = malloc((len+1)*8*sizeof(unsigned char));
iv3 = malloc((len+1)*8*sizeof(unsigned char));
buf = malloc((len+1)*8*sizeof(unsigned char));
memset(tmp, 0x00, (len+1)*8);
memset(iv3, 0x00, (len+1)*8);
memset(buf, 0x00, (len+1)*8);
strcpy((char *)iv3, "00000000");
memcpy(tmp, clearText, len*8+i);
}
len = ret;
//循环加密, 每8字节一次
for(i=0; i
{
DES_cbc_encrypt(tmp+8*i, buf+8*i, 8, &keySchedule, iv3, DES_ENCRYPT);
memcpy(iv3, buf+8*i, 8);
}
free(tmp);
free(iv3);
*cipherText = buf;
return ret;
}
int des_decrypt(const unsigned char *cipherText, unsigned int cipherLen, char **clearText, const char *key)
{
DES_cblock keyEncrypt;
DES_key_schedule keySchedule;
const_DES_cblock inputText;
DES_cblock outputText;
DES_cblock *iv3;
unsigned char *tmp;
char *buf;
int len = strlen(key);
int ret = 0;
int i, j;
memset(&keyEncrypt, 0x00, sizeof(keyEncrypt));
memset(keyEncrypt, 0x00, 8);
iv3 = malloc(8*sizeof(unsigned char));
//构造补齐后的密钥
if(len <= 8)
{
memcpy(keyEncrypt, key, len);
}
else
{
memcpy(keyEncrypt, key, 8);
}
//密钥置换
DES_set_key_unchecked(&keyEncrypt, &keySchedule);
len = cipherLen;
tmp = malloc(len*8*sizeof(unsigned char));
buf = malloc(len*8*sizeof(unsigned char));
memset(tmp, 0x00, len*8);
memset(iv3, 0x00, 8);
memset(buf, 0x00, len*8);
memcpy(tmp, cipherText, len*8);
//循环加密, 每8字节一次
for(i=len-1; i>0; i--)
{
memcpy(iv3, tmp+8*(i-1), 8);
DES_cbc_encrypt(tmp+8*i, buf+8*i, 8, &keySchedule, iv3, DES_DECRYPT);
}
strcpy((char *)iv3, "00000000");
DES_cbc_encrypt(tmp+8*i, buf+8*i, 8, &keySchedule, iv3, DES_DECRYPT);
free(tmp);
free(iv3);
*clearText = buf;
return len;
}
int main(int argc, char **argv)
{
char *srcText = "this is an example";
char *desKey = "12345";
char *decText;
unsigned char *a;
int len;
int i;
printf("=== des加解密 ===\n");
len = des_encrypt(srcText, &a, desKey);
for(i=0; i
{
printf("%02x", a[i]);
}
printf("\n");
len = des_decrypt(a, len, &decText, desKey);
printf("%s\n", decText);
free(a);
free(decText);
return 0;
}