您现在的位置是:首页 > 正文

AES-128-CBC加解密方法:nodejs加密QT解密(附C语言版加解密全过程)

2024-02-01 06:41:02阅读 3

服务器端使用的是nodejs编写的代码,对明文进行加密,客户端使用的是QT4.5.3编写代码,调用openssl crypto库函数,对密文进行解密。

注意:加解密要对等,即加解密的秘钥相同,向量也要相同,由于是两种不同的语言写的代码,因此两边都要做好一致性检查,比如秘钥的处理,密文的编码方式等等。

这里两边都对秘钥进行了MD5加密,并设置向量和秘钥一样(可自由设置秘钥和向量,我们的代码中处理成一样的比较便捷),密文采用base64编码,因此在QT那边一定要用fromBase64()来获取密文,否则会出错。

以下是nodejs加密端的代码:

function encChangeFuzzy(data) {
	var key = "test";
	var secretKey = new Buffer(key, "utf8");
	secretKey = crypto.createHash("md5").update(secretKey).digest("hex");
	secretKey = new Buffer(secretKey, "hex");
	iv = secretKey;//设置向量和秘钥相同
	var cipher = crypto.createCipheriv("aes-128-cbc", secretKey, iv), coder = [];
	coder.push(cipher.update(data, "utf8", "base64"));
	coder.push(cipher.final("base64"));
	return coder.join("");
}

以下是QT端解密的代码:

#include<QObject>
#include <QtCore> 

#include <openssl/aes.h>



int aes_decrypt(unsigned char *in, unsigned char *key, unsigned char* ivec, unsigned char *out)
{
    if(!in || !key || !out) return 0;
    AES_KEY aes;
    if(AES_set_decrypt_key(key, 128, &aes) < 0)//设置解密秘钥
    {
        return 0;
    }
    int dateSize = strlen( (char*)in );

    AES_cbc_encrypt(in, out, dateSize, &aes, ivec, AES_DECRYPT);//解密

    /**pack5padding,获取最后一位数,以该数为个数,将out指向区域的最后位数用0替代**/
    int out_len = strlen((char*)out);
    int last_value = (unsigned char)out[out_len-1];
    memset(out+out_len-last_value, 0, last_value);
    return 1;
}

QString deCode( QString key,QString ivec, QString code)
{
    int MSG_LEN = code.size();

    //对秘钥进行MD5加密
    QByteArray byteArray;
    byteArray = key.toLatin1();
    QByteArray hash = QCryptographicHash::hash(byteArray, QCryptographicHash::Md5);
    //QByteArray strMD5 = hash.toHex();
    //qDebug()<<"strMD5"<<strMD5.constData()<<" hash"<<hash;
    //将加密后的秘钥转为unsigned char*类型
    unsigned char keyArray[AES_BLOCK_SIZE];
    memset((unsigned char*)keyArray, 0x00 ,AES_BLOCK_SIZE);
    strcpy( (char*)keyArray, hash.constData() );

    //对向量进行MD5加密
//    QByteArray byteArrayIv;
//    byteArrayIv = ivec.toLatin1();
//    QByteArray hashIv = QCryptographicHash::hash(byteArrayIv, QCryptographicHash::Md5);
//    //加密后的向量转为unsigned char*类型
//    unsigned char ivArray[AES_BLOCK_SIZE];
//    memset((unsi

网站文章

  • 亿美软通出席硬核桃5G开发者社区周年庆,喜获“金核桃奖”

    亿美软通出席硬核桃5G开发者社区周年庆,喜获“金核桃奖”

    12月15日,亿美软通受邀出席硬核桃5G消息开发者社区周年庆活动。庆典现场,亿美软通CMO张翀对与硬核桃“结缘”一年来亿美在5G消息方面的发展成果做了分享,同时也针对“商用在即,5G消息CSP信息服务...

    2024-02-01 06:40:54
  • 逐行对比LLaMA2和LLaMA模型源代码

    逐行对比LLaMA2和LLaMA模型源代码

    这是因为键和值的数量直接影响了注意力矩阵和值矩阵的大小,如果序列长度非常大,这些矩阵的存储和计算可能会变得非常昂贵。在这种情况下,需要在计算注意力权重前,将键和值的头数通过复制的方式扩展到与查询头数一...

    2024-02-01 06:40:49
  • fork源码分析

    文章目录

    2024-02-01 06:40:24
  • 计算机语言bus代表什么,计算机中bus指什么

    大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。计算机中bus是指总线,总线的作用就是在计算机各部件之间传递信息,由数据总线,地址总线和控制总线组成。总线(Bus)是计算机各种功能...

    2024-02-01 06:40:17
  • 【漏洞复现】JDWP远程命令执行漏洞

    【漏洞复现】JDWP远程命令执行漏洞

    0x01 漏洞描述JPDA(Java Platform Debugger Architecture):即Java平台调试体系架构。Java虚拟机设计的专门的API接口供调试和监控虚拟机使用JPDA按照...

    2024-02-01 06:40:09
  • Node.js模块加载机制

    I. 使用require()加载自定义模块是,必须以./或者…/开头的路径标识符。在加载自定义模块时,如果没有指定./或者…/这样的路径标识符,则node会把它当作内置模块或者第三方模块进行加载。II...

    2024-02-01 06:39:41
  • 从源码分析:Java中的SPI是怎样工作的

    spi介绍提到api,大家或多或少地都接触或者使用过,但是如果说到spi呢,可能了解的人就要少一些。Java SPI的全...

    2024-02-01 06:39:33
  • 家用 文件服务器,家用文件服务器

    家用 文件服务器,家用文件服务器

    家用文件服务器 内容精选换一换远程桌面协议(Remote Desktop Protocol,RDP),是微软提供的多通道的远程登录协议。本节为您介绍如何使用RDP文件远程登录Windows弹性云服务器...

    2024-02-01 06:39:25
  • SpringCloud-向Eureka注册中心注册微服务(微服务的搭建)

    SpringCloud-向Eureka注册中心注册微服务(微服务的搭建)

    Eureka注册中心注册微服务 注明:此项目为本人学习尚硅谷老师的教学视频然后整理核心的配置文件,所有的项目均在以下地址下载。https://github.com/xwbGithub/microservicecloud下载, 本章讲解请参考microservicecloud-provider-dept-8001,首先微服务的服务中心...

    2024-02-01 06:38:54
  • spring实现aop的步骤

    spring实现aop的步骤

    首先注意导入一个jar包! 在applicationContext.xml中配置扫包 :开启aop的自动代理 切面类 @Component//spri

    2024-02-01 06:38:47