一、单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);
}

OPENSSL库的使用-DES篇的更多相关文章

  1. DES加解密 cbc模式 的简单讲解 && C++用openssl库来实现的注意事项

    DES cbc是基于数据块加密的.数据块的长度为8字节64bit.以数据块为单位循环加密,再拼接.每个数据块加密的秘钥一样,IV向量不同.第一个数据快所需的IV向量,需要我们提供,从第二个数据块开始, ...

  2. C++ 使用openssl库实现 DES 加密——CBC模式 && RSA加密——公加私解——私加公解

    之前工作上需要用C++把软件生成的用户序列号用des加密cbc的模式,加密后为二进制,转化为十六进制,然后提供给java写的授权码管理平台. java平台会根据用户序列号,生成一个授权码,授权码是用r ...

  3. 使用openssl库实现des,3des加密

    原文地址: 使用openssl库实现des,3des加密 主要是调整了一下格式,以及一些变量的类型,以解决在VC2008下无法编译通过的问题. #include <stdio.h> #in ...

  4. 使用openssl库实现RSA、AES数据加密

         openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所 ...

  5. [转]使用openssl库实现RSA、AES数据加密

    openssl是可以很方便加密解密的库,可以使用它来对需要在网络中传输的数据加密.可以使用非对称加密:公钥加密,私钥解密.openssl提供了对RSA的支持,但RSA存在计算效率低的问题,所以一般的做 ...

  6. RSA加解密 私钥加密公钥解密 私加公解 && C++ 调用openssl库 的代码实例

    前提:秘钥长度=1024 ============================================== 对一片(117字节)明文加密  私加 ===================== ...

  7. C++调用openssl库生成RSA加密秘钥对

    直接上代码.默认生成的是pkcs#1格式 // ---- rsa非对称加解密 ---- // #define KEY_LENGTH 1024 // 密钥长度 #define PUB_KEY_FILE ...

  8. Qt开发笔记:OpenSSL库介绍、windows上mingw32版本的OpenSSL编译模块化

    前言   Windows上mingw32版本的openssl的编译是属于比较棘手的,OpenSSL本身不提供支持..   OpenSSL 介绍   OpenSSL是一个开放源代码的软件库包,应用程序可 ...

  9. OpenSSL库验证PKCS7签名

    使用Crypto库签名和验证签名请参考Crypto库实现PKCS7签名与签名验证,可以使用OpenSSL库验证Crypto签名,OpenSSL验证签名可使用简单的代码描述如下: //signature ...

随机推荐

  1. Arduino M0 的一个坑(2015-12-25)

    前几天收到 Arduino M0,试各项功能都正常,可就是串口监视器/串口助手不能显示程序里打印的输出,好生奇怪,各种换波特率各种PC串口程序换着试,资料不多,官方资料也只说到 Serial1 用于 ...

  2. SpringBoot接口服务处理Whitelabel Error Page(转)

    To switch it off you can set server.error.whitelabel.enabled=false http://stackoverflow.com/question ...

  3. SWIFT学习笔记01

    1.Swift.用来推断option是不是nil,相当于OC的 if(option) if let name = option{ greeting = "if=====" }els ...

  4. Tomcat 内存设置

    大型项目或者使用了SSH 的话, Tomcat 可能会报 java.lang.OutOfmemoryError: PermGen Space Windows: 在 bin/catlina.bat 最上 ...

  5. ZOJ 2856 Happy Life 暴力求解

    因为是Special Judge 的题目,只要输出正确答案即可,不唯一 暴力力求解, 只要每次改变 happiness 值为负的人的符号即可. 如果计算出当前人的 happiness 值为负,那么将其 ...

  6. 2014 HDU多校弟八场H题 【找规律把】

    看了解题报告,发现看不懂 QAQ 比较简单的解释是这样的: 可以先暴力下达标,然后会发现当前数 和 上一个数 的差值是一个 固定值, 而且等于当前数与i(第i个数)的商, 于是没有规律的部分暴力解决, ...

  7. 同步fifo的verilogHDL设计实例

    原创 设计一个fifo,输入16bit,输出16bit的data,寻址宽度5bit,有空满标志. top 层如下所示: /* date : 2014/10/14 version : modelsim ...

  8. m序列产生器

    扩频通讯中会用的到伪随机数列 —— m序列 代码中是5bit原始码 module m_generate ( clock , reset , m_code ); input clock ,reset ; ...

  9. hpu第五届acm比赛

    vijos P1211生日日数   描述 CCC老师的生日是YY年MM月DD日,他想知道自己出生后第一万天纪念日的日期(出生日算第0天). 格式 输入格式 从文件的第一行分别读入YY,MM,DD其中1 ...

  10. C++将文件内容一次性读入内存

    结合字符串流,将文件中的内容一次性读入内存,代码如下: #include <string> using std::ostringstream; using std::ifstream; u ...