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工程师来解决安卓的问 ...
随机推荐
- [No0000F6]C# 继承
继承是面向对象程序设计中最重要的概念之一.继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易.同时也有利于重用代码和节省开发时间. 当创建一个类时,程序员不需要完全重新编写新的数 ...
- hive优化之参数调优
1.hive参数优化之默认启用本地模式 启动hive本地模式参数,一般建议将其设置为true,即时刻启用: hive (chavin)> set hive.exec.mode.local.aut ...
- Delphi IdHTTP 设置cookie 和访问后读取Cookie 值
procedure TForm1.btn1Click(Sender: TObject); var IdHTTP: TIdHTTP; mstrCookie: string; Cookies ...
- Java之旅_高级教程_序列化
摘自 :http://www.runoob.com/java/java-serialization.html Java序列化 Java提供了一种对象序列化的机制,该机制中,一个对象可以被表示为一个字 ...
- Phone list(Trie树模板)
Phone List 共t组数据,给定n个长度不超过10的字符串,问其中是否存在两个数S,T,使得S是T的前缀. 存在则输出NO,不存在输出YES 输入样例#1: 2 3 911 97625999 9 ...
- SpringBoot静态资源访问
在我们开发Web应用的时候,需要引用大量的js.css.图片等静态资源. 默认配置: Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则: /static ...
- 使用natapp将本地服务映射到外网
1.进入https://natapp.cn注册并登陆,然后下载客户端 2. 3. 4.打开客户端开启映射
- [转载]智能科普:VR、AR、MR的区别
智能科普:VR.AR.MR的区别 http://news.zol.com.cn/553/5534833.html news.zol.com.cn 2015-11-23 16:00 近日, 获得谷歌5亿 ...
- 数据库级别DML操作监控审计、表触发器/对象触发器
使用触发器记录DML,使用触发器记录表的DML 数据库级别DML操作监控审计.表触发器/对象触发器 --创建记录表 CREATE TABLE T_SHALL_LOG ( ID , ) , EVTIME ...
- pymysql 模块 使用目录
mysql python pymysql模块 基本使用 mysql python pymysql模块 增删改查 插入数据 介绍 commit() execute() executemany() 函数 ...