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



http://www.tuicool.com/articles/3mAjqma

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章