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

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