一、单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. Java之对象序列化和反序列化

    一.对象序列化和反序列化存在的意义: 当你创建对象,只要你需要,他就一直存在,但当程序结束,对象就会消失,但是存在某种情况,如何让程序在不允许的状态,仍然保持该对象的信息.并在下次程序运行的时候使用该 ...

  2. web测试 结果存储类型为“Database”,但尚未指定结果储存库连接字符串

    vs2010 Ultimate版带有web测试功能,可以对网站的性能以及负载进行测试. 在进行负载测试时提示“异常 LoadTestConnectStringMissingException 1 Lo ...

  3. selenium 怎么处理display:none

    页面HTML是这样的:  .... <div class="cf w index-middle"> <div id="li" class=&q ...

  4. 高级UNIX环境编程2

    perror("error:") ;  strerror 日历时间:time_t (1970.1.1开始的秒数)     struct timeval (秒数和微秒)  struc ...

  5. LINUX下使用crontab进行RMAN备份实验

    之前写了脚本,手动执行可以,使用crontab总是无法运行成功,今天下午花了两个小时实验,完成如下: 注意事项:脚本完成首先手动执行,确定可以正常执行. 在crontab中使用,要注意以下几点: 1. ...

  6. 「操作系统」:The most useful condition codes

    CF: Carry Flag.The most recent operation generated a carry out of the most significant bit. Used to ...

  7. Muduo 网络编程示例之零:前言

    陈硕 (giantchen_AT_gmail)Blog.csdn.net/Solstice Muduo 全系列文章列表: http://blog.csdn.net/Solstice/category/ ...

  8. Shiro入门(1)

    =============基本概念=================== 什么是Apache Shiro? Apache Shiro(发音为“shee-roh”,日语“堡垒(Castle)”的意思)是 ...

  9. 第二种:NSObject

    - (void)viewDidLoad { [super viewDidLoad]; /** * 开启子线程的方式之一:NSObject */ // 第一个参数:selector // 第二个参数:方 ...

  10. stm32之GPIO

    stm32有5组GPIO口,GPIOA GPIOB GPIOC GPIOD GPIOE 每个GPIO端口有: 2个配置寄存器GPIOx_CRL, GPIOx_CRH(32位): 2个数据寄存器GPIO ...