OPENSSL库的使用-DES篇

一、单DES算法ECB模式加解密

1、使用函数DES_set_key_unchecked设置密钥

2、使用函数DES_ecb_encrypt来进行数据加解密

void DES_ecb_encrypt(const_DES_cblock *input,DES_cblock *output,
             DES_key_schedule *ks,int enc);

函数功能说明:DES ECB计算

参数说明:

input: 输入数据;(8字节长度)

output: 输出数据;(8字节长度)

ks: 密钥;

enc:加密:DES_ENCRYPT , 解密:DES_DECRYPT;

二、单DES算法CBC模式加解密

1、使用函数DES_set_key_unchecked设置密钥

2、使用函数DES_ncbc_encrypt来进行数据加解密

void DES_ncbc_encrypt(const unsigned char *input,unsigned char *output,
              long length,DES_key_schedule *schedule,DES_cblock *ivec,
              int enc);

参数说明:

input: 输入数据;(8字节长度)

output: 输出数据;(8字节长度)

length: 数据长度;(这里数据长度不包含初始化向量长度

schedule:密钥;

ivec: 初始化向量;(一般为8个字节0)

enc:加密:DES_ENCRYPT , 解密:DES_DECRYPT;

三、T-DES算法ECB模式加解密

1、使用函数DES_set_key_unchecked设置密钥

2、使用函数DES_ecb3_encrypt来进行加解密

void DES_ecb3_encrypt(const_DES_cblock *input, DES_cblock *output,
              DES_key_schedule *ks1,DES_key_schedule *ks2,
              DES_key_schedule *ks3, int enc);

函数说明:

3DES ECB算法

参数说明:

input: 输入数据

output: 输出数据

ks1,ks2,ks3, 3DES算法的三只密钥,实际应用中,大家更习惯于用两只密钥,调用此函数时,只需在ks3处传入ks1即可;

enc:加密:DES_ENCRYPT , 解密:DES_DECRYPT

四、T-DES算法CBC模式加解密

1、使用函数DES_set_key_unchecked设置密钥

2、使用函数DES_ede3_cbc_encrypt来进行加解密

void DES_ede3_cbc_encrypt(const unsigned char *input,unsigned char *output,
              long length,
              DES_key_schedule *ks1,DES_key_schedule *ks2,
              DES_key_schedule *ks3,DES_cblock *ivec,int enc);

函数功能说明:

3DES CBC模式计算;

参数说明:

input: 输入数据;(8字节长度)

output: 输出数据;(8字节长度)

length: 长度;(这里数据长度不包含初始化向量长度

ks1:密钥1;(为16字节密钥的左边8字节)

ks2:密钥2;(为16字节密钥的右边8字节)

ks3:密钥3;(为16字节密钥的左边8字节)

ivec:初始化向量;;(一般为8个字节0)

enc:DES_ENCRYPT , 解密:DES_DECRYPT;

五、示例代码

void CPage1::OnButtonEncrypt()
{
 // TODO: Add your control notification handler code here
 DES_cblock key;

 unsigned char key_hex[256] = {0};
 unsigned char data_hex[256] = {0};
 unsigned char initval_hex[256] = {0};
 unsigned char temp[256] = {0};
 int i = 0;
 int keylen = 0;
 int datalen = 0;
 int InitialLen = 0;
 DES_key_schedule schedule;
 DES_key_schedule schedule2;
 DES_key_schedule schedule3;
 const_DES_cblock input;
 DES_cblock output;
 DES_cblock ivec;

    UpdateData(TRUE);

 m_key.Remove(' ');
 m_data.Remove(' ');
 m_initval.Remove(' ');
 
 keylen = m_key.GetLength()/2;
    datalen = m_data.GetLength()/2;
 InitialLen = m_initval.GetLength()/2;

 if (keylen%8!=0)
 {
  AfxMessageBox("输入密钥长度不是8的整数倍,请重新输入!");
  return;
 }

 if (datalen%8!=0)
 {
  AfxMessageBox("输入数据长度不是8的整数倍,请重新输入!");
  return;
 }

 StrToHex(m_key,key_hex,keylen);
 StrToHex(m_data,data_hex,datalen);
 StrToHex(m_initval,initval_hex,InitialLen);

//单DES密钥设置

 if (keylen == 8)
 {
  memcpy(key,key_hex,keylen);
  DES_set_key_unchecked(&key, &schedule);
 }

//三DES密钥设置
 else if (keylen == 16)
 {
  memcpy(key,key_hex,8);
        DES_set_key_unchecked(&key, &schedule);
  memcpy(key,key_hex+8,8);
        DES_set_key_unchecked(&key, &schedule2);
  memcpy(key,key_hex,8);
        DES_set_key_unchecked(&key, &schedule3);
 }
   
 
 memcpy(ivec,initval_hex,InitialLen);

 //单DES算法
 if (keylen == 8)
 {
  //ECB模式
        if (((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck())
  {
   for(i = 0;i < datalen/8;i++)
   {
    memcpy(input,data_hex+i*8,8);
    DES_ecb_encrypt(&input, &output, &schedule, DES_ENCRYPT);
    memcpy(temp+i*8,output,8);
   }
  }
  //CBC模式
  else if (((CButton*)GetDlgItem(IDC_RADIO2))->GetCheck())
  {
   for(i = 0;i < datalen/8;i++)
   {
    DES_ncbc_encrypt(data_hex+i*8, temp+i*8,8,&schedule,&ivec, DES_ENCRYPT);
   }
  }
 }
 //TDES算法
 else if (keylen == 16)
 {
  //ECB模式
        if (((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck())
  {
   for (i = 0;i < datalen/8;i++)
   {
    memcpy(input,data_hex+i*8,8);
    DES_ecb3_encrypt(&input, &output, &schedule, &schedule2, &schedule3, DES_ENCRYPT);
    memcpy(temp+i*8,output,8);
   }
   
  }
  //CBC模式
  else if (((CButton*)GetDlgItem(IDC_RADIO2))->GetCheck())
  {
   for(i = 0;i < datalen/8;i++)
   {
    DES_ede3_cbc_encrypt(data_hex+i*8, temp+i*8,8,&schedule, &schedule2, &schedule3,&ivec, DES_ENCRYPT);
   }
  }

 }
 
 HexToStr(temp,datalen,m_result);

    UpdateData(FALSE);
}

原文地址:https://www.cnblogs.com/riskyer/p/3320170.html