//参考 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加密相关推荐

  1. QT使用OpenSSL的DES/CBC/PKCS7加密字符串

    首先安装Openssl,然后QT项目的pro文件中添加引用 加密方法大部分来自:C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 ...

  2. C++调用openssl实现DES加密解密cbc模式 zeropadding填充方式 pkcs5padding填充方式 pkcs7padding填充方式...

    ============================================== des   cbc  加密 zeropadding填充方式 ======================= ...

  3. DES加解密工具(DES/ECB、DES/CBC)

    DES加解密代码如下: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder;import javax.crypto.Cipher; ...

  4. CBC模式的DES加密算法(加密字符串、加密文件)

    a) 所有协议数据采用标准的CBC模式的DES加密算法: b) 密钥长度为8位,可以为空(为空时,默认是8个0) c) 所有协议数据采用8位初始向量(VI)做互斥运算 d) 所有协议数据的明文需要在尾 ...

  5. Java和.NET使用DES对称加密的区别

    Java和.NET的系统类库里都有封装DES对称加密的实现方式,但是对外暴露的接口却各不相同,甚至有时会让自己难以解决其中的问题,比如Java加密后的结果在.NET中解密不出来等,由于最近项目有跨Ja ...

  6. pyDes 实现 Python 版的 DES 对称加密/解密--转

    https://my.oschina.net/leejun2005/blog/586451 手头有个 Java 版的 DES 加密/解密程序,最近想着将其 Python 重构下,方便后续脚本解析,捣鼓 ...

  7. Java DES 加解密(DES/CBC/PKCS5Padding)

    /*** DES加密** @param data 加密数据* @param key 密钥* @return 返回加密后的数据*/public static byte[] desEncrypt(byte ...

  8. .NET中的DES对称加密

    DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...

  9. js des加密 java_java JS DES互相加密解密 通用!!!

    如果 出现 异常 javax.crypto.IllegalBlockSizeException 那就看我博客园的 另外一篇  解决这个异常 帮客户整了1天 试了N个JS 的方法 终于找我弄出来了! j ...

最新文章

  1. 机器学习-单个感知器实现逻辑或(matlab实现)
  2. windows平台搭建Mongo数据库复制集(类似集群)(一)
  3. java 服务器读取客户端文件,java 服务器读取客户端文件
  4. Mybatis判断表是否存在
  5. Oracle 9i和10g安装后的基本环境与服务
  6. 5G 基站功耗,到底有多可怕?
  7. jackson 驼峰注解_jackson 常用注解,比如忽略某些属性,驼峰和下划线互转
  8. 优先队列之Leetcode 23合并K个有序链表
  9. 桌面云之深信服VMP平台搭建
  10. SmartGit一个月试用期过期的解决方法
  11. 高科技口罩可以5分钟内灭活新冠病毒;华伦天奴美妆全线产品将登陆中国市场 | 美通企业日报...
  12. 任务栏-IDEA图标变白色
  13. PD虚拟机设置替代ALT+F4(关闭窗口)的快捷键的方法
  14. python源代码的后缀名是什么_Python
  15. 什么是http接口?
  16. 纯电动汽车两档ATM变速箱simulink模型,模型实现了两档AMT换挡策略和换挡过程仿真
  17. idea如何配置或者创建mybatis的xml文件 idea如何配置或者创建mybatis的配置文件
  18. kaggle数据分析入门之---视频游戏销售分析
  19. Hdu1208 Pascal's Travels
  20. 会计学原理学习笔记——第三章——账户与复式记账(3.4生产准备业务核算——材料采购业务核算)

热门文章

  1. HTML5CSS3提高
  2. 怎么下载windows10正版系统
  3. 基于java的驾校管理系统
  4. python小白到全栈_python全栈第八讲
  5. vr全景拍的常规步骤,3dvr全景制作所要用到哪些软件
  6. 第一部分 Handsfree机器人产品介绍
  7. 解决运行java application时提示Could not find the main class.Program will exit.问题
  8. python读取cad_AutoCAD多段线定点坐标获取Python脚本
  9. 新闻稿发布后还能修改吗
  10. 【已解决】通过PMID或PMCID下载sc-Seq基因数据集