当前位置: 首页 > news >正文

临沂市开发区可以做分销的网站做酒店工作去哪个招聘网站好

临沂市开发区可以做分销的网站,做酒店工作去哪个招聘网站好,wordpress文章底部添加自定义内容,服务器免费试用本篇博文讲述如何在Qt C的环境中使用OpenSSL实现AES-CBC-Pkcs7加/解密#xff0c;可以一次性加解密一个任意长度的明文字符串或者字节流#xff0c;但不适合分段读取加解密的#xff08;例如#xff0c;一个4GB的大型文件需要加解密#xff0c;要分段读取#xff0c;每次…本篇博文讲述如何在Qt C的环境中使用OpenSSL实现AES-CBC-Pkcs7加/解密可以一次性加解密一个任意长度的明文字符串或者字节流但不适合分段读取加解密的例如一个4GB的大型文件需要加解密要分段读取每次读取10MB就加解密10MB这种涉及全文件填充而不是每个10MB片段填充具有较复杂的上下文处理本文不探讨这种 Qt中的QByteArray比较好用所以我本篇文章不使用标准C的unsigned char数组而是用QByteArray代替所以要依赖Qt的环境如果你不用Qt就想办法把QByteArray改回unsigned char数组。 一、简介 AES略自行百度 CBC略自行百度 PKCS7填充方式AES支持多种填充方式如NoPadding、PKCS5Padding、ISO10126Padding、PKCS7Padding、ZeroPadding。PKCS7兼容PKCS5,目前PKCS7比较通用。 二、实现方式 1.使用以下3个接口实现AES-CBC加解密注意PKCS7的填充需要自己另外实现这3个接口在Openssl的v3.0版本以后被废弃 int AES_set_encrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); int AES_set_decrypt_key(const unsigned char *userKey, const int bits, AES_KEY *key); void AES_cbc_encrypt(const unsigned char *in, unsigned char *out,size_t length, const AES_KEY *key, unsigned char *ivec, const int enc); 2.使用Openssl的EVP接口实现AES-CBC加解密推荐v3.0以前以后得版本都可以兼容但执行效率比上面3个接口稍差 EVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void); void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *c); EVP_CIPHER_CTX_init(EVP_CIPHER_CTX *c);int EVP_CIPHER_CTX_set_padding(EVP_CIPHER_CTX *c, int pad);int EVP_EncryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv); int EVP_EncryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); int EVP_EncryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl);int EVP_DecryptInit_ex(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, ENGINE *impl, const unsigned char *key, const unsigned char *iv); int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl, const unsigned char *in, int inl); int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *outm, int *outl); 三、实现方式非EVP接口 描述这种方式使用Openssl v3.0以前的旧接口实现Pkcs7填充需要自己实现。 1.先写一个处理Pkcs7填充/去填充的工具类 #ifndef PADDING_H #define PADDING_H#include QByteArray/*** brief 数据填充类对齐类* 算法数据填充模式提供对数据进行PKCS7填充和去除填充的相关函数。*/class Padding { public:Padding();/*** brief GntPadding::getPKCS7PaddedLength* 根据原始数据长度计算进行PKCS7填充后的数据长度* param dataLen 原始数据长度* param alignSize 对齐字节数* return 返回填充后的数据长度*/static int getPKCS7PaddedLength(int dataLen, int alignSize);/*** brief Padding::PKCS7Padding* 采用PKCS7Padding方式将in数据进行alignSize字节对齐填充。* 此函数用于加密前对明文进行填充。* param in 数据* param alignSize 对齐字节数* return 返回填充后的数据*/static QByteArray PKCS7Padding(const QByteArray in, int alignSize);/*** brief Padding::PKCS7UnPaddinged* 采用PKCS7Padding方式将in数据去除填充。* 此函数用于解密后对解密结果进一步去除填充以得到原始数据直接在原字节数组中剔除* 由于减少了整个字节数组的拷贝所以比Padding::PKCS7UnPadding效率高一些* param in 数据字节数组* return 无返回*/static void PKCS7UnPadding(QByteArray in); };#endif // PADDING_H#include padding.hPadding::Padding() {}int Padding::getPKCS7PaddedLength(int dataLen, int alignSize) {// 计算填充的字节数按alignSize字节对齐进行填充int remainder dataLen % alignSize;int paddingSize (remainder 0) ? alignSize : (alignSize - remainder);return (dataLen paddingSize); }QByteArray Padding::PKCS7Padding(const QByteArray in, int alignSize) {// 计算需要填充字节数按alignSize字节对齐进行填充int remainder in.size() % alignSize;int paddingSize (remainder 0) ? alignSize : (alignSize - remainder);char paddingChar static_castchar(paddingSize);// 进行填充QByteArray temp(in);temp.append(paddingSize, paddingChar);return temp; }void Padding::PKCS7UnPadding(QByteArray in) {char paddingSize in.at(in.size() - 1);in.chop(static_castint(paddingSize)); }2.封装aes-cbc的加解密接口 /** * brief AES::cbc_encrypt * CBC模式加解密填充模式采用PKCS7 * 对任意长度明文进行一次加解密根据机器内存情况尽量不要太长。 * param in 输入数据 * param out 输出结果 * param key 密钥长度必须是16/24/32字节否则加密失败 * param ivec 初始向量长度必须是16字节 * param enc true-加密false-解密 * return 执行结果 */ bool AES::cbc_encrypt(const QByteArray in, QByteArray out, const QByteArray key, const QByteArray ivec, bool enc) {// 检查密钥合法性(只能是16、24、32字节)if(key.size() ! 16 key.size() ! 24 key.size() ! 32){qInfo() __FUNCTION__ aes cbc key size error!;return false;}if(ivec.size() ! 16) // 初始向量为16字节{qInfo() __FUNCTION__ aes cbc ivc size error!;return false;}if (enc){// 生成加密keyAES_KEY aes_key;if (AES_set_encrypt_key(reinterpret_castconst unsigned char*(key.data()), key.size() * 8, aes_key) ! 0){return false;}// 进行PKCS7填充QByteArray inTemp Padding::PKCS7Padding(in, AES_BLOCK_SIZE);// 执行CBC模式加密QByteArray ivecTemp ivec; // ivec会被修改故需要临时变量来暂存out.resize(inTemp.size()); // 调整输出buf大小AES_cbc_encrypt(reinterpret_castconst unsigned char*(inTemp.data()),reinterpret_castunsigned char*(out.data()),static_castsize_t(inTemp.size()),aes_key,reinterpret_castunsigned char*(ivecTemp.data()),AES_ENCRYPT);return true;}else{// 生成解密keyAES_KEY aes_key;if (AES_set_decrypt_key(reinterpret_castconst unsigned char*(key.data()), key.size() * 8, aes_key) ! 0){return false;}// 执行CBC模式解密QByteArray ivecTemp ivec; // ivec会被修改故需要临时变量来暂存out.resize(in.size()); // 调整输出buf大小AES_cbc_encrypt(reinterpret_castconst unsigned char*(in.data()),reinterpret_castunsigned char*(out.data()),static_castsize_t(in.size()),aes_key,reinterpret_castunsigned char*(ivecTemp.data()),AES_DECRYPT);// 解除PKCS7填充Padding::PKCS7UnPadding(out);return true;} } 四、实现方式EVP接口 描述这种方式使用Openssl的evp接口实现内置各种填充不需要自己实现支持大型文件分段读取分段加解密使用简易性和灵活性都很高执行效率和资源消耗比非evp接口差一些。 /** * brief AES::evp_cbc_encrypt * CBC模式加解密填充模式采用PKCS7 * 对任意长度明文进行一次加解密根据机器内存情况尽量不要太长。 * param in 输入数据 * param out 输出结果 * param key 密钥长度必须是16/24/32字节否则加密失败 * param ivec 初始向量长度必须是16字节 * param enc true-加密false-解密 * return 执行结果 */ bool AES::evp_cbc_encrypt(const QByteArray in, QByteArray out, const QByteArray key, const QByteArray ivec, bool enc) {const EVP_CIPHER *cipher nullptr;switch (key.size()){case 16:cipher EVP_aes_128_cbc();break;case 24:cipher EVP_aes_192_cbc();break;case 32:cipher EVP_aes_256_cbc();break;default:{qInfo() __FUNCTION__ aes cbc key size error!;return false;}}if(ivec.size() ! 16){qInfo() __FUNCTION__ aes cbc ivc size error!;return false;}// 创建 EVP cipher 上下文EVP_CIPHER_CTX *ctx EVP_CIPHER_CTX_new();// 初始化 cipher 上下文(初始化为默认值)EVP_CIPHER_CTX_init(ctx);// 加解密实际输出长度中间标记int out_update_len 0;int out_final_len 0;// openssl接口执行结果返回值int ret 0;// 加密if(enc){// 设置 cipher 上下文设置秘钥、初始向量ret EVP_EncryptInit_ex(ctx, cipher, nullptr, reinterpret_castconst unsigned char*(key.data()), reinterpret_castconst unsigned char*(ivec.data()));if(ret ! 1){qInfo() __FUNCTION__ EVP_EncryptInit_ex() error!;EVP_CIPHER_CTX_free(ctx);return false;}// 加密填充方式 PKCS7填充会自动兼容PKCS5ret EVP_CIPHER_CTX_set_padding(ctx, EVP_PADDING_PKCS7);if(ret ! 1){qInfo() __FUNCTION__ EVP_CIPHER_CTX_set_padding() error! set PKCS7 Padding error!;EVP_CIPHER_CTX_free(ctx);return false;}// 密文输出缓冲区设置大小(未加密数据的大小一个加密填充块大小)不一定会完全使用。out.resize(in.size() AES_BLOCK_SIZE);// 对数据进行加密out_update_len out.size();ret EVP_EncryptUpdate(ctx, reinterpret_castunsigned char*(out.data()), out_update_len, reinterpret_castconst unsigned char*(in.data()), in.size());if(ret ! 1){qInfo() __FUNCTION__ EVP_EncryptUpdate() error!;EVP_CIPHER_CTX_free(ctx);return false;}// 完成加密过程并获取最终结果out_final_len 0;ret EVP_EncryptFinal_ex(ctx, reinterpret_castunsigned char*(out.data()) out_update_len, out_final_len);if(ret ! 1){qInfo() __FUNCTION__ EVP_EncryptFinal_ex() error!;EVP_CIPHER_CTX_free(ctx);return false;}}else // 解密{// 设置 cipher 上下文设置秘钥、初始向量ret EVP_DecryptInit_ex(ctx, cipher, nullptr, reinterpret_castconst unsigned char*(key.data()), reinterpret_castconst unsigned char*(ivec.data()));if(ret ! 1){qInfo() __FUNCTION__ EVP_DecryptInit_ex() error!;EVP_CIPHER_CTX_free(ctx);return false;}// 解密填充方式 PKCS7填充会自动兼容PKCS5ret EVP_CIPHER_CTX_set_padding(ctx, EVP_PADDING_PKCS7);if(ret ! 1){qInfo() __FUNCTION__ EVP_CIPHER_CTX_set_padding() error! set PKCS7 Padding error!;EVP_CIPHER_CTX_free(ctx);return false;}// 明文输出缓冲区设置大小(未解密数据的大小)不一定会完全使用。out.resize(in.size());out.fill(0);// 对数据进行解密out_update_len out.size();ret EVP_DecryptUpdate(ctx, reinterpret_castunsigned char*(out.data()), out_update_len, reinterpret_castconst unsigned char*(in.data()), in.size());if(ret ! 1){qInfo() __FUNCTION__ EVP_DecryptUpdate() error!;EVP_CIPHER_CTX_free(ctx);return false;}// 完成解密过程并获取最终结果out_final_len 0;ret EVP_DecryptFinal_ex(ctx, reinterpret_castunsigned char*(out.data()) out_update_len, out_final_len);if(ret ! 1){qInfo() __FUNCTION__ EVP_DecryptFinal_ex() error!;EVP_CIPHER_CTX_free(ctx);return false;}}// 总的实际加解密数据长度为前面更新部分的长度加上最终部分的长度out_update_len out_final_len;// 去除输出缓冲区末尾多余的长度out.chop(out.size() - out_update_len);// 释放 cipher 上下文EVP_CIPHER_CTX_free(ctx);return true; } 五、测试结果 加密 // 点击了加密按钮触发加密流程 void AESTestWidget::on_btnEncrypt_clicked() {//加密明文字符串QByteArray encryptText;QByteArray encryptTextBase64;QByteArray key(ui-leEncryptKey-text().toUtf8());QByteArray ivec(ui-leEncryptIV-text().toUtf8());// 加密将明文加密为二进制数据//AES::cbc_encrypt(ui-tePlaintext2Encrypt-toPlainText().toUtf8(), encryptText, key, ivec, true);AES::evp_cbc_encrypt(ui-tePlaintext2Encrypt-toPlainText().toUtf8(), encryptText, key, ivec, true);// 对加密后的二进制数据进行base64编码并显示encryptTextBase64 encryptText.toBase64();ui-teCiphertextBase64-setText(QString::fromUtf8(encryptTextBase64));// 显示密文二进制数据的十六进制字符串ui-teCiphertextHex-setText(QString::fromUtf8(encryptText.toHex()));} 解密 // 点击了解密按钮触发解密流程 void AESTestWidget::on_btnDecrypt_clicked() {//解密base64编码的密文字符串QByteArray decryptText;QByteArray key(ui-leDecryptKey-text().toUtf8());QByteArray ivec(ui-leDecryptIV-text().toUtf8());// 解密先将base64编码的密文转为二进制字节数据再解密//AES::cbc_encrypt(QByteArray::fromBase64(ui-teCiphertext2Decrypt-toPlainText().toUtf8()),decryptText, key, ivec, false);AES::evp_cbc_encrypt(QByteArray::fromBase64(ui-teCiphertext2Decrypt-toPlainText().toUtf8()),decryptText, key, ivec, false);qDebug() 解密结果 decryptText;ui-tePlaintextByDecrypt-setText(QString::fromUtf8(decryptText)); }
http://www.hkea.cn/news/14541402/

相关文章:

  • 石家庄规划建设局网站门户网站建设多久
  • 建设资讯网站全球做网站的公司排名
  • 晨光文具店网站建设响水做网站的
  • 营销网站的成功案例外贸公司英文网站
  • 直播网站建设需要多少钱青岛做家纺的公司网站
  • 福州市网站建设公司莱芜网站优化是什么
  • 广东睿营建设有限公司网站做网站大概费用
  • 廊坊网站建设制作天猫与京东的网站建设管理
  • 企业免费网站建设哪里比较好南昌seo网站推广
  • 咸宁有做网站的吗网站右下角弹出广告代码
  • 如何做网站 seo有免费查企业的软件吗
  • 怎么做好营销网站开发公众号第三方建微网站
  • 漯河有没有做网站的中国设计网室内
  • 电脑端网站和手机网站区别2022年中国电商行业分析报告
  • 网站开发学什么语言wordpress edd支付宝
  • 要建网站怎么做可以做问卷赚钱的网站
  • 做网站的收入来源小程序代理哪家好济宁
  • 做期货应关注什么网站wordpress文章分类插件
  • 建设工程消防设计备案哪个网站做网站的经历感想
  • 建网站带支付链接淘宝网页模板免费下载
  • dw设计做网站案例惠州专业做网站
  • 星沙网站优化seo全国企业信息查询官网系统
  • 深圳手机网站建设报价推广网站是什么意思
  • 唐山网站建设拓seo设置是什么
  • 网站建设与管理作业手机网站开发企业
  • 网站怎么做架构网站如何做数据分析报告
  • 云南建设网官方网站h5企业网站定制排名
  • 单页网站上传教程网站建设中怎么解决
  • 营销网站科技微信推广广告在哪里做
  • 福州网络营销网站室内设计效果图手绘线稿