openssl实现des cbc加密
//参考 https://www.cnblogs.com/azbane/p/10179660.html
QByteArray ZYB::Openssl::DES_CBC(const QByteArray &keyStr, const QByteArray &data, ZYB::Openssl::Type type)
{
DES_cblock keyEncrypt;
memset(keyEncrypt, 0, 8);
memcpy(keyEncrypt, keyStr.constData(), static_cast<size_t>(keyStr.length()));
DES_key_schedule keySchedule;//密钥表
DES_set_key_unchecked(&keyEncrypt, &keySchedule);//设置密钥,且不检测密钥奇偶性
//IV设置为0x0000000000000000
DES_cblock ivec;
memset(ivec, 0, sizeof(ivec));
int len = 0;
unsigned char* output = nullptr;
switch (type) {
case Encrypt: {
len = (data.length()+7)/8 * 8;
output = new unsigned char[len+1];
memset(output, '\0', static_cast<size_t>(len+1) );
DES_ncbc_encrypt(reinterpret_cast<const uchar *>(data.data()),
output,
data.length(),
&keySchedule, &ivec, DES_ENCRYPT);
break;
}
case Decrypt: {
len = data.length();
output = new unsigned char[len+1];
memset(output, '\0', static_cast<size_t>(len+1) );
DES_ncbc_encrypt(reinterpret_cast<const uchar *>(data.data()),
output,
data.length() + 1,
&keySchedule, &ivec, DES_DECRYPT);
break;
}
}
QByteArray array;
for(int i=0; i<len; ++i)
array.append(static_cast<char>( output[i] ) );
delete []output;
return array;
}
//与DES_CBC结果一致
QByteArray ZYB::Openssl::DES_CBC_zeros(const QByteArray &key, const QByteArray &data, ZYB::Openssl::Type type)
{
DES_cblock keyEncrypt;
memset(keyEncrypt, 0, 8);
memcpy(keyEncrypt, key.constData(), static_cast<size_t>(key.length()));
DES_key_schedule keySchedule;//密钥表
DES_set_key_unchecked(&keyEncrypt, &keySchedule);//设置密钥,且不检测密钥奇偶性
//IV设置为0x0000000000000000
DES_cblock ivec;
memset(ivec, 0, sizeof(ivec));
const_DES_cblock inputText;
DES_cblock outputText;
QByteArray array;
switch (type) {
case Encrypt: {
for(int i=0; i<data.length()/8; ++i) {
memcpy(inputText, data.constData() + i * 8, 8);
DES_ncbc_encrypt(inputText, outputText, 8, &keySchedule, &ivec, DES_ENCRYPT); //加密
for (int j = 0; j < 8; ++j) {
array.append( static_cast<char>(outputText[j]) );
}
//重置ivec
memcpy(ivec, outputText, 8);
}
if(data.length() % 8 != 0) {
int tmp1 = data.length() / 8 * 8;
int tmp2 = data.length() - tmp1;
memset(inputText, 0, 8);
memcpy(inputText, data.constData() + tmp1, static_cast<size_t>(tmp2) );
DES_ncbc_encrypt(inputText, outputText, 8, &keySchedule, &ivec, DES_ENCRYPT); //加密
for (int j = 0; j < 8; ++j) {
array.append( static_cast<char>(outputText[j]) );
}
}
break;
}
case Decrypt: {
for(int i=0; i<data.length()/8; ++i) {
memcpy(inputText, data.constData() + i * 8, 8);
DES_ncbc_encrypt(inputText, outputText, 8, &keySchedule, &ivec, DES_DECRYPT); //加密
for (int j = 0; j < 8; ++j) {
array.append( static_cast<char>(outputText[j]) );
}
//重置ivec //解密过程不需要用前一块的结果作为下一块的IV
//memcpy(ivec, outputText, 8);
}
if(data.length() % 8 != 0) {
int tmp1 = data.length() / 8 * 8;
int tmp2 = data.length() - tmp1;
memset(inputText, 0, static_cast<size_t>(tmp2));
memcpy(inputText, data.constData() + tmp1, static_cast<size_t>(tmp2) );
DES_ncbc_encrypt(inputText, outputText, tmp2, &keySchedule, &ivec, DES_DECRYPT); //加密
for (int j = 0; j < 8; ++j) {
array.append( static_cast<char>(outputText[j]) );
}
}
break;
}
}
return array;
}
QByteArray ZYB::Openssl::DES_CBC_pkcs5(const QByteArray &key, const QByteArray &data, ZYB::Openssl::Type type)
{
DES_cblock keyEncrypt;
memset(keyEncrypt, 0, 8);
memcpy(keyEncrypt, key.constData(), static_cast<size_t>(key.length()));
DES_key_schedule keySchedule;//密钥表
DES_set_key_unchecked(&keyEncrypt, &keySchedule);//设置密钥,且不检测密钥奇偶性
//IV设置为0x0000000000000000
DES_cblock ivec;
memset(ivec, 0, sizeof(ivec));
const_DES_cblock inputText;
DES_cblock outputText;
QByteArray array;
switch (type) {
case Encrypt: {
for(int i=0; i<data.length()/8; ++i) {
memcpy(inputText, data.constData() + i * 8, 8);
DES_ncbc_encrypt(inputText, outputText, 8, &keySchedule, &ivec, DES_ENCRYPT); //加密
for (int j = 0; j < 8; ++j) {
array.append( static_cast<char>(outputText[j]) );
}
//重置ivec
memcpy(ivec, outputText, 8);
}
if(data.length() % 8 != 0) {
int tmp1 = data.length() / 8 * 8;
int tmp2 = data.length() - tmp1;
memset(inputText, (8-tmp2), 8);
memcpy(inputText, data.constData() + tmp1, static_cast<size_t>(tmp2) );
}
else {
memset(inputText, 8, 8);
}
DES_ncbc_encrypt(inputText, outputText, 8, &keySchedule, &ivec, DES_ENCRYPT); //加密
for (int j = 0; j < 8; ++j) {
array.append( static_cast<char>(outputText[j]) );
}
break;
}
case Decrypt: {
for(int i=0; i<data.length()/8; ++i) {
memcpy(inputText, data.constData() + i * 8, 8);
DES_ncbc_encrypt(inputText, outputText, 8, &keySchedule, &ivec, DES_DECRYPT); //加密
for (int j = 0; j < 8; ++j) {
array.append( static_cast<char>(outputText[j]) );
}
//重置ivec //解密过程不需要用前一块的结果作为下一块的IV
//memcpy(ivec, outputText, 8);
}
if(data.length() % 8 != 0) {
int tmp1 = data.length() / 8 * 8;
int tmp2 = data.length() - tmp1;
memset(inputText, 0, static_cast<size_t>(tmp2));
memcpy(inputText, data.constData() + tmp1, static_cast<size_t>(tmp2) );
DES_ncbc_encrypt(inputText, outputText, tmp2, &keySchedule, &ivec, DES_DECRYPT); //加密
for (int j = 0; j < 8; ++j) {
array.append( static_cast<char>(outputText[j]) );
}
}
break;
}
}
return array;
}
openssl实现des cbc加密相关推荐
- QT使用OpenSSL的DES/CBC/PKCS7加密字符串
首先安装Openssl,然后QT项目的pro文件中添加引用 加密方法大部分来自:C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 ...
- C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式...
============================================== des cbc 加密 zeropadding填充方式 ======================= ...
- DES加解密工具(DES/ECB、DES/CBC)
DES加解密代码如下: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;import javax.crypto.Cipher; ...
- CBC模式的DES加密算法(加密字符串、加密文件)
a) 所有协议数据采用标准的CBC模式的DES加密算法: b) 密钥长度为8位,可以为空(为空时,默认是8个0) c) 所有协议数据采用8位初始向量(VI)做互斥运算 d) 所有协议数据的明文需要在尾 ...
- Java和.NET使用DES对称加密的区别
Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...
- pyDes 实现 Python 版的 DES 对称加密/解密--转
https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...
- Java DES 加解密(DES/CBC/PKCS5Padding)
/*** DES加密** @param data 加密数据* @param key 密钥* @return 返回加密后的数据*/public static byte[] desEncrypt(byte ...
- .NET中的DES对称加密
DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...
- js des加密 java_java JS DES互相加密解密 通用!!!
如果 出现 异常 javax.crypto.IllegalBlockSizeException 那就看我博客园的 另外一篇 解决这个异常 帮客户整了1天 试了N个JS 的方法 终于找我弄出来了! j ...
最新文章
- 机器学习-单个感知器实现逻辑或(matlab实现)
- windows平台搭建Mongo数据库复制集(类似集群)(一)
- java 服务器读取客户端文件,java 服务器读取客户端文件
- Mybatis判断表是否存在
- Oracle 9i和10g安装后的基本环境与服务
- 5G 基站功耗,到底有多可怕?
- jackson 驼峰注解_jackson 常用注解,比如忽略某些属性,驼峰和下划线互转
- 优先队列之Leetcode 23合并K个有序链表
- 桌面云之深信服VMP平台搭建
- SmartGit一个月试用期过期的解决方法
- 高科技口罩可以5分钟内灭活新冠病毒;华伦天奴美妆全线产品将登陆中国市场 | 美通企业日报...
- 任务栏-IDEA图标变白色
- PD虚拟机设置替代ALT+F4(关闭窗口)的快捷键的方法
- python源代码的后缀名是什么_Python
- 什么是http接口?
- 纯电动汽车两档ATM变速箱simulink模型,模型实现了两档AMT换挡策略和换挡过程仿真
- idea如何配置或者创建mybatis的xml文件 idea如何配置或者创建mybatis的配置文件
- kaggle数据分析入门之---视频游戏销售分析
- Hdu1208 Pascal's Travels
- 会计学原理学习笔记——第三章——账户与复式记账(3.4生产准备业务核算——材料采购业务核算)