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

  • 相关阅读:
    monads-are-elephants(转)
    程序语言简史(转)
    语法的省略不能造成编译器的歧义
    scala getter and setter
    隐式类型转换
    java 调用 scala
    列表的操作
    Scala HandBook
    Scala 高级编程练习
    Net 2.0 C# 专用的只读类Tuple
  • 原文地址:https://www.cnblogs.com/riskyer/p/3320170.html
Copyright © 2020-2023  润新知