==============================================

    des   cbc  加密 zeropadding填充方式

==============================================

//加密 cbc zeropadding 自己实现
std::string des_cbc_zero_encrypt(const std::string &clearText, const std::string &key)
{
static unsigned char cbc_iv[] = {'j', 'k', 't', '', '', '', '', ''};
//初始化IV向量
std::string strCipherText;
DES_cblock keyEncrypt, ivec;
memset(keyEncrypt, , ); if (key.length() <= )
memcpy(keyEncrypt, key.c_str(), key.length());
else
memcpy(keyEncrypt, key.c_str(), ); DES_key_schedule keySchedule; //密钥表
DES_set_key_unchecked(&keyEncrypt, &keySchedule); //设置密钥,且不检测密钥奇偶性 memcpy(ivec, cbc_iv, sizeof(cbc_iv)); // 循环加密,每8字节一次
const_DES_cblock inputText;
DES_cblock outputText;
std::vector<unsigned char> vecCiphertext;
unsigned char tmp[]; for (int i = ; i < clearText.length() / ; i++)
{
memcpy(inputText, clearText.c_str() + i * , );
DES_ncbc_encrypt(inputText, outputText, , &keySchedule, &ivec, DES_ENCRYPT); //加密
memcpy(tmp, outputText, ); for (int j = ; j < ; j++)
vecCiphertext.push_back(tmp[j]); //重置ivec
memcpy(ivec, outputText, );
} if (clearText.length() % != )
{
int tmp1 = clearText.length() / * ;
int tmp2 = clearText.length() - tmp1;
memset(inputText, , );
memcpy(inputText, clearText.c_str() + tmp1, tmp2);
// 加密函数
DES_ncbc_encrypt(inputText, outputText, , &keySchedule, &ivec, DES_ENCRYPT); //加密
memcpy(tmp, outputText, ); for (int j = ; j < ; j++)
vecCiphertext.push_back(tmp[j]);
} strCipherText.clear();
strCipherText.assign(vecCiphertext.begin(), vecCiphertext.end());
return strCipherText;
}

==============================================

    des   cbc  加密 pkcs5padding填充方式  pkcs7padding跟pkcs5padding是一致的

==============================================

//加密 cbc pkcs5padding 自己实现  //pkcs7padding 跟 pkcs5padding是一样的
std::string des_cbc_pkcs5_encrypt(const std::string &clearText, const std::string &key)
{
static unsigned char cbc_iv[] = {'j', 'k', 't', '', '', '', '', ''};
//初始化IV向量
std::string strCipherText;
DES_cblock keyEncrypt, ivec;
memset(keyEncrypt, , ); if (key.length() <= )
memcpy(keyEncrypt, key.c_str(), key.length());
else
memcpy(keyEncrypt, key.c_str(), ); DES_key_schedule keySchedule; //密钥表
DES_set_key_unchecked(&keyEncrypt, &keySchedule); //设置密钥,且不检测密钥奇偶性 memcpy(ivec, cbc_iv, sizeof(cbc_iv)); // 循环加密,每8字节一次
const_DES_cblock inputText;
DES_cblock outputText;
std::vector<unsigned char> vecCiphertext;
unsigned char tmp[]; for (int i = ; i < clearText.length() / ; i++)
{
memcpy(inputText, clearText.c_str() + i * , );
DES_ncbc_encrypt(inputText, outputText, , &keySchedule, &ivec, DES_ENCRYPT); //加密
memcpy(tmp, outputText, ); for (int j = ; j < ; j++)
vecCiphertext.push_back(tmp[j]); //重置ivec
memcpy(ivec, outputText, );
} if (clearText.length() % != )
{
int tmp1 = clearText.length() / * ;
int tmp2 = clearText.length() - tmp1;
memset(inputText,(-tmp2), );
memcpy(inputText, clearText.c_str() + tmp1, tmp2);
}
else
{
memset(inputText,, );
}
// 加密函数
DES_ncbc_encrypt(inputText, outputText, , &keySchedule, &ivec, DES_ENCRYPT); //加密
memcpy(tmp, outputText, ); for (int j = ; j < ; j++)
vecCiphertext.push_back(tmp[j]); strCipherText.clear();
strCipherText.assign(vecCiphertext.begin(), vecCiphertext.end());
return strCipherText;
}

==============================================

    des   cbc  解密 zeropadding pkcs5padding  pkcs7padding都是一致的

==============================================

//解密 cbc pkcs5padding 自己实现  //zeropadding / pkcs7padding 跟 pkcs5padding是一样的
std::string des_cbc_pkcs5_decrypt(const std::string &cipherText, const std::string &key)
{
static unsigned char cbc_iv[] = {'j', 'k', 't', '', '', '', '', ''};
//初始化IV向量
std::string clearText;
DES_cblock keyEncrypt, ivec;
memset(keyEncrypt, , ); if (key.length() <= )
memcpy(keyEncrypt, key.c_str(), key.length());
else
memcpy(keyEncrypt, key.c_str(), ); DES_key_schedule keySchedule; //密钥表
DES_set_key_unchecked(&keyEncrypt, &keySchedule); //设置密钥,且不检测密钥奇偶性 memcpy(ivec, cbc_iv, sizeof(cbc_iv)); // 循环解密,每8字节一次
const_DES_cblock inputText;
DES_cblock outputText;
std::vector<unsigned char> vecCleartext;
unsigned char tmp[]; for (int i = ; i < cipherText.length() / ; i++)
{
memcpy(inputText, cipherText.c_str() + i * , );
DES_ncbc_encrypt(inputText, outputText, , &keySchedule, &ivec, DES_DECRYPT); //解密
memcpy(tmp, outputText, ); for (int j = ; j < ; j++)
vecCleartext.push_back(tmp[j]); //重置ivec
//memcpy(ivec, outputText, 8); //解密过程不需要用前一块的结果作为下一块的IV
} if (clearText.length() % != )
{
int tmp1 = clearText.length() / * ;
int tmp2 = clearText.length() - tmp1;
memset(inputText,, tmp2);
memcpy(inputText, cipherText.c_str() + tmp1, tmp2);
DES_ncbc_encrypt(inputText, outputText, tmp2, &keySchedule, &ivec, DES_DECRYPT); //解密
memcpy(tmp, outputText, tmp2);
for (int j = ; j < ; j++)
vecCleartext.push_back(tmp[j]);
}
clearText.clear();
clearText.assign(vecCleartext.begin(), vecCleartext.end());
return clearText;
}

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

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

C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式的更多相关文章

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

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

  2. Android DES加密的CBC模式加密解密和ECB模式加密解密

    DES加密共有四种模式:电子密码本模式(ECB).加密分组链接模式(CBC).加密反馈模式(CFB)和输出反馈模式(OFB). CBC模式加密: import java.security.Key; i ...

  3. javascript JS CryptoJS DES加解密CBC模式与C#DES加解密相同互通

    我们只知道不同的语言解密要相互通用,就需要遵循相同的加密方式,然而在具体做技术预研的时候,就发现会遇到很多问题,网上找的资料也是比较片面,所以我踩了坑,并且把解决方案和相关资料源码提供出来,给需要的朋 ...

  4. php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密

    PHP使用openssl进行Rsa加密,如果要加密的明文太长则会出错,解决方法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文:解密的时候需要128个字符解密一下,然后拼接成数据. 加 ...

  5. openssl evp RSA 加密解密

    openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...

  6. des加密解密——java加密,php解密

    最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...

  7. 一个java的DES加密解密类转换成C#

    一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.P ...

  8. Golang之AES/DES加密解密

    AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...

  9. 兼容PHP和Java的des加密解密代码分享

    这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...

随机推荐

  1. 【紫书】Ordering Tasks UVA - 10305 拓扑排序:dfs到底再输出。

    题意:给你一些任务1~n,给你m个数对(u,v)代表做完u才能做v 让你给出一个做完这些任务的合理顺序. 题解:拓扑排序版题 dfs到底再压入栈. #define _CRT_SECURE_NO_WAR ...

  2. MSSQL数据库优化经验

    数据库优化的目标无非是避免磁盘I/O瓶颈.减少CPU利用率和减少资源竞争.1. 在业务密集的SQL当中尽量不采用IN操作符2.  不使用not in 因为它不能应用表的索引.用not exists 或 ...

  3. arcengine右键实现new group layer的功能

    没有找到相关方法,但是有对图层组进行操作的资料. https://gis.stackexchange.com/questions/43620/how-do-i-reach-a-layer-inside ...

  4. [Day5]方法

    1.方法 (1)概念:方法就是用来完成解决某件事情或实现某个功能的办法 会包含很多条语句用于完成某些有意义的功能 通过在程序代码中引用方法名称和所需的参数,实现在该程序中执行(或称调用)该方法 (2) ...

  5. [others]tinycore/microcore

    https://zh.wikipedia.org/wiki/Tiny_Core_Linux https://github.com/zeit/micro

  6. 50 行代码教你爬取猫眼电影 TOP100 榜所有信息

    对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天,恋习Python的手把手系列,手把手教你入门Python爬虫,爬取猫眼电影TOP100榜信息,将涉及到基础爬虫 ...

  7. 内存的一些magic number和debug crt(0xCCCCCCCC和0xCDCDCDCD,debug版本的CRT为了方便调试程序的初始值)

    调试过debug版本的vc程序的人一定对0xCCCCCCCC和0xCDCDCDCD这样的内存很有印象.这是debug版本的CRT为了方便调试程序,在分配出来还没有初始化的时候提供的初始值. 实际上,W ...

  8. TZOJ 5225: 玩转二叉树

    描述 给定一棵二叉树的中序遍历和前序遍历,请你先将树做个镜面反转,再输出反转后的层序遍历的序列.所谓镜面反转,是指将所有非叶结点的左右孩子对换.这里假设键值都是互不相等的正整数. 输入 输入第一行给出 ...

  9. 跨域的问题(nginx解决才是王道)

    跨域分为两类:一时get跨域,而是post跨域.常见的是三种: 一种是jsonp, $.ajax({ url: "http://127.0.0.1/~chenjiebin/mycode/ph ...

  10. 8.0-uC/OS-III临界段

    1.临界段 (临界段代码,也叫临界区,是指那些必须完整连续运行,不可被打断的代码段) 锁调度器,可以执行ISR,开启调度器不可执行ISR: (1).临界段代码,也称作临界域,是一段不可分割的代码. u ...