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工程师来解决安卓的问 ...
随机推荐
- [No0000C5]VS2010删除空行
VS2010删除空行,查找内容:^:b*$\n,替换为:,查找范围:当前文档,使用:正则表达式
- AngularJs $watch监听模型变化
$watch是一个scope函数,用于监听模型变化,当你的模型部分发生变化时它会通知你. $watch(watchExpression, listener, objectEquality); 举个栗子 ...
- 2018/03/07 每日一个Linux命令 之 cat
每日一个Linux命令 2018-03-07 Linux 命令 cat cat [-参数] fileName 在之前的Linux使用中 cat 命令一直作为文本输出指令来使用,很少可以深入学习的该命令 ...
- STLの应用
QAQ因为绝望地发现好像这些应用都没有题目...所以就专门开了个随笔存题面qwq 谁的孙子最多 给定一棵树,其中1号节点是根节点,问哪一个节点的孙子节点最多,有多少个.(孙子节点,就是儿子节点的儿子节 ...
- 【JMeter】【接口测试】csv参数化,数据驱动,自动化测试
csv参数化,数据驱动 首先我们要有一个接口测试用例存放的地方,我们这里用EXCEL模板管理,里面包含用例编号.入参.优先级.请求方式.url等等. 1:新建一个txt文件,命名为sjqd,后缀名 ...
- 20170915 shell
1.什么是Shell 一种电脑程序与文本文件,利用Shell 可以进行系统管理,文件操作等. 2.认识bash 这个Shell 由于管理整个计算机硬件的其实是操作系统的内核(kernel),用户一般都 ...
- SSH高级服务
SSH端口转发 SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据.但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的 加密及解密服务.这 ...
- jquery小结收藏
//根据id获取控件的值,如果没有数据默认赋值为0 function getDataById(id) { var data = $("#"+id).val(); if(data== ...
- JAVA基础——集合——ArrayList
ArrayList集合 ArrayList的一些方法(JDK1.8): 将指定的元素附加到列表的末尾,true:添加成功,false:添加失败: public boolean add(E e) ...
- linux iscsi挂载与卸载
iscsiadm -m discovery -t sendtargets -p 192.168.4.245:3260 #扫描ISCSI Target 列出所有LUN iscsiadm -m node ...