C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式
==============================================
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填充方式的更多相关文章
- DES加解密 cbc模式 的简单讲解 && C++用openssl库来实现的注意事项
DES cbc是基于数据块加密的.数据块的长度为8字节64bit.以数据块为单位循环加密,再拼接.每个数据块加密的秘钥一样,IV向量不同.第一个数据快所需的IV向量,需要我们提供,从第二个数据块开始, ...
- Android DES加密的CBC模式加密解密和ECB模式加密解密
DES加密共有四种模式:电子密码本模式(ECB).加密分组链接模式(CBC).加密反馈模式(CFB)和输出反馈模式(OFB). CBC模式加密: import java.security.Key; i ...
- javascript JS CryptoJS DES加解密CBC模式与C#DES加解密相同互通
我们只知道不同的语言解密要相互通用,就需要遵循相同的加密方式,然而在具体做技术预研的时候,就发现会遇到很多问题,网上找的资料也是比较片面,所以我踩了坑,并且把解决方案和相关资料源码提供出来,给需要的朋 ...
- php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密
PHP使用openssl进行Rsa加密,如果要加密的明文太长则会出错,解决方法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文:解密的时候需要128个字符解密一下,然后拼接成数据. 加 ...
- openssl evp RSA 加密解密
openssl evp RSA 加密解密 可以直接使用RSA.h 提供的接口 如下测试使用EVP提供的RSA接口 1. EVP提供的RSA 加密解密 主要接口: int EVP_PKEY_encryp ...
- des加密解密——java加密,php解密
最近在做项目中,遇到des加密解密的问题. 场景是安卓app端用des加密,php这边需要解密.之前没有接触过des这种加密解密算法,但想着肯定会有demo.因此百度,搜了代码来用.网上代码也是鱼龙混 ...
- 一个java的DES加密解密类转换成C#
一个java的des加密解密代码如下: //package com.visionsky.util; import java.security.*; //import java.util.regex.P ...
- Golang之AES/DES加密解密
AES/DES加密/解密涉及4个概念:1. Block, 也叫分组, 相应加密/解密的算法. 2. BlockMode, 模式, 相应加密/解密的处理.3. InitalVectory, 初始向量4. ...
- 兼容PHP和Java的des加密解密代码分享
这篇文章主要介绍了兼容PHP和Java的des加密解密代码分享,适合如服务器是JAVA语言编写,客户端是PHP编写,并需要des加密解密的情况,需要的朋友可以参考下 作为一个iOS工程师来解决安卓的问 ...
随机推荐
- 生成树协议(STP)
首先了解一下环路问题: 两个交换机将两个局域网同时连接起来的时候,不幸地出现了环路: 这两个交换机还是都能够收到广播包的.交换机 A 一开始是不知道机器 2 在哪个局域网的,所以它会把广播消息放到局域 ...
- 查询大数据表的效率对比:Linq to SQL、Entity Framework、企业库存储过程、ADO.Net
最近因为要开发大数据量网站,特作比较. Linq to SQL 查询 记录数:399997Linq to SQL 查询 Milliseconds:1910视图查询 记录数:399997视图查询 Mil ...
- jvisualvm All-in-One Java Troubleshooting Tool
java 监控.故障.性能可视化分析 VisualVM: Download https://visualvm.github.io/download.html All-in-One Java Troub ...
- Chap1:基本概念[《区块链中文词典》维京&甲子]
- Xcode编译警告Assigning to 'id<XXXDelegat> ——Nullable' from incompatible type 'XXXView *const_strong'
编译报警告 可能是 自定义分类使用协议时出现与父类协议的冲突 解决方法如下:
- [UI] UI things
反正我不懂. 但是很酷. https://facebook.github.io/react/ https://cn.vuejs.org/ https://angular.cn/
- java之获取资源文件
背景介绍 在java程序中有时我们需要加载项目中的某些资源文件(如:config.properties之类),以便获取里面的值,这样可以避免某些需要经常修改的数据硬编码入业务程序中 实现方式 实现这种 ...
- Appium环境配置(二)
一.使用Eclipse直接创建案例工程 1.打开Eclipse,[File]-->[New]-->[Project] 2.选择[Java Project]-->[Next] 3.输入 ...
- spring学习(01)之IOC
spring学习(01)之IOC IOC:控制反转——Spring通过一种称作控制反转(IOC)的技术促进了低耦合.当应用了IOC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创 ...
- c语言数组应用
#include <stdio.h> #define SIZE 5 int main(void) { int sum[3]={0},sum2[SIZE]={0},i,sum1=0; dou ...