目录

Base64加密

Base64加密

Base64解密

异或加密

测试

Base64加密

Base64解密

异或加密

异或解密

最后


Base64加密

Base64加解密密主要用Qt的两个函数,即

QByteArray QByteArray::toBase64() const
QByteArray QByteArray::fromBase64(const QByteArray & base64) [static]

下面自己封装两个函数,一个加密,一个解密。

Base64加密

/***************************************************************FunctionName:    EncryptAndSaveJPGPurpose:       加载图片,Base64加密后保存,并返回加密后的图片数据Parameter:        1 btImage [QByteArray, OUT]加密的图片数据2 fullPath [QString, IN]图片的全路径Return:         return true if sucess,else return falseRemark:          NULL
****************************************************************/
bool EncryptAndSaveJPG(QByteArray& btImage, QString fullPath)
{QFile file(fullPath);if (!file.open(QFile::WriteOnly)){QMessageBox::warning(this, QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("不能写文件 %1:\n%2.").arg(fullPath).arg(file.errorString()));return false;}//加密QByteArray encryImag = btImage.toBase64();file.write(encryImag);file.close();return true;
}

Base64解密

/***************************************************************FunctionName:    LoadJPGAndDecrptPurpose:        加载图片,Base64解密,并返回解密后的图片数据Parameter:       1 btImage [QByteArray, OUT]解密的图片数据2 filefullPath [QString, IN]图片的全路径Return:         return true if sucess,else return falseRemark:          NULL
****************************************************************/
bool LoadJPGAndDecrpt(QByteArray& btImage, QString filefullPath)
{QFile file(filefullPath);if (!file.open(QFile::ReadOnly)){QMessageBox::warning(this, QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("不能读取文件 %1:\n%2.").arg(filefullPath).arg(file.errorString()));return false;}btImage = QByteArray::fromBase64(file.readAll());file.close();return true;
}

异或加密

异或加解密一个函数就可以搞定。即将待加密/解密的图片的每一个字节与0xff异或。

/***************************************************************FunctionName:    XorEncryAndDecryPurpose:        将图片数据与key值异或,key一般取0xffParameter:        1 QByteArray [QByteArray, IN]待加/解密的图片数据2 btImageOut [QByteArray, OUT]加/解密后的图片数据3 key [const char, INT]键值Return:         NULLRemark:         NULL
****************************************************************/
void XorEncryAndDecry(QByteArray& btImageIn, QByteArray& btImageOut, const char &key)
{for (int i = 0; i < btImageIn.size(); i++){btImageOut[i] = btImageIn[i] ^ key;}
}

测试

下面调用测试一下,可以弹出对话框选取文件。

Base64加密

void encry_Slot()
{QString filePath = QFileDialog::getOpenFileName(this);if (filePath.isEmpty()){return;}QFile read_file(filePath);if (!read_file.open(QIODevice::ReadOnly)){QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("文件读取失败!"));return;}QByteArray btImage = read_file.readAll();bool bResult = EncryptAndSaveJPG(btImage, filePath);if (bResult){QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("加密完成!"));}
}

Base64解密

void decry_Slot()
{QString fileName = QFileDialog::getOpenFileName(this);QByteArray btImage;if (!fileName.isEmpty()){bool bResult = LoadJPGAndDecrpt(btImage, fileName);if (bResult){QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("解密完成!"));}//保存解密后的图片QFile file(fileName);if (!file.open(QFile::WriteOnly)){QMessageBox::warning(this, QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("不能写文件 %1:\n%2.").arg(fileName).arg(file.errorString()));return;}file.write(btImage);file.close();}
}

异或加密

void encryXor_Slot()
{QString filePath = QFileDialog::getOpenFileName(this);if (filePath.isEmpty()){return;}QFile read_file(filePath);if (!read_file.open(QIODevice::ReadOnly)){QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("文件读取失败!"));return;}QByteArray btImage = read_file.readAll();QByteArray btImageXor;XorEncryAndDecry(btImage, btImageXor, 0xff);QFile write_file(filePath);if (!write_file.open(QFile::WriteOnly)){QMessageBox::warning(this, QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("不能写文件 %1:\n%2.").arg(filePath).arg(write_file.errorString()));return;}//加密write_file.write(btImageXor);read_file.close();write_file.close();QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("加密完成!"));}

异或解密

void decryXor_Slot()
{QString fileName = QFileDialog::getOpenFileName(this);if (fileName.isEmpty()){return;}QFile file(fileName);if (!file.open(QFile::ReadOnly)){QMessageBox::warning(this, QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("不能读取文件 %1:\n%2.").arg(fileName).arg(file.errorString()));return;}QByteArray btImageXor = file.readAll();QByteArray btImage;XorEncryAndDecry(btImageXor, btImage, 0xff);//保存解密后的图片QFile write_file(fileName);if (!write_file.open(QFile::WriteOnly)){QMessageBox::warning(this, QString::fromLocal8Bit("提示"),QString::fromLocal8Bit("不能写文件 %1:\n%2.").arg(fileName).arg(write_file.errorString()));return;}write_file.write(btImage);write_file.close();file.close();QMessageBox::warning(this, QStringLiteral("提示"), QStringLiteral("解密完成!"));
}

最后

测试发现,解密后的图片与原图大小一致,且每一个字节数据都一致。

测试程序地址:https://download.csdn.net/download/qq_24282081/11295479

mfc下Base64加解密文件请看:

https://blog.csdn.net/qq_24282081/article/details/100527570

Qt下图片加密的两种方式相关推荐

  1. 实现Windows下Qt扫描U盘的两种方式

    参考网上资源,总结了如下实现Windows下Qt扫描U盘的两种方式:. 方式1: 检测Windows的事件–WM_DEVICECHANGE 缺点:想要检测时,必须发生过一次U盘插拔动作,需要手动&qu ...

  2. Python:实现图片裁剪的两种方式——Pillow和OpenCV

    原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还 ...

  3. Python图片裁剪的两种方式——Pillow和OpenCV

    本文参考Python图片裁剪的两种方式--Pillow和OpenCV并进行了一些更新 感谢作者:hfutdog 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一 ...

  4. python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...

  5. Python实现图片裁剪的两种方式——Pillow和OpenCV

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. 首先,我们有 ...

  6. linux下安装mysql的方式_linux下安装mysql的两种方式

    linux下安装mysql的两种方式 1 源码安装 1 创建mysql用户: useradd mysql passwd mysql 2 解压缩下载的mysql包: tar -zxvf mysql-5. ...

  7. Android点击图片随机,android 设置图片随机出现-两种方式

    android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的id ivBg ...

  8. ubuntu下创建定时任务的两种方式及常见问题解决方案

    ubuntu下创建定时任务的两种方式及常见问题解决方案 参考文章: (1)ubuntu下创建定时任务的两种方式及常见问题解决方案 (2)https://www.cnblogs.com/maboii/p ...

  9. SpringBoot 配置文件加密的两种方式

    SpringBoot配置文件加密的两种方式 jasypt使用方式 用法一: 1.Application.java上增加注解@EnableEncryptableProperties(jasypt-spr ...

  10. Qt实现多线程编程的两种方式

    Qt实现多线程编程的两种方式 方式一: 继承自QThread类,覆写run函数.此实现方法只有run函数内的代码是运行在子线程内. 代码示例: #ifndef QDEMOTHREAD_H #defin ...

最新文章

  1. 职场思想分享002 | 入职第一个月工资这样花,一年内工资至少再涨50%!
  2. Git 初始化及仓库创建及操作
  3. 【JavaScript】Document对象学习
  4. 《大道至简》第二章读后感
  5. HDOJ 1106 排序
  6. 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(二)之分库分表路由...
  7. 012-P2P加速Docker镜像分发(阿里Dragonfly)
  8. vue相关--自己看看的
  9. UninstallPKG for Mac(PKG文件卸载)
  10. 如何在Windows中将“显示桌面”图标移动到快速启动栏或任务栏
  11. 《十周成为数据分析师》笔记——业务线 第五节 用户画像体系
  12. java 获取Authorization信息
  13. Qt QString 增、删、改、查、格式化等常用方法总结
  14. matlab 路由表,闭关修炼之zigbee路由
  15. 办公室office工具————Word基础
  16. cad管道阀门符号dwg_cad管道阀门符号怎么画(CAD怎么画系统图,特殊符号怎么搞,像管道系统图,...)...
  17. 什么叫做ECS云服务器?
  18. China creates vast research infrastructure to support ambitious climate goals
  19. 生存or倒闭,区块链公司在2019年死磕的每一天 |链捕手
  20. 仿XP皮肤弹出式日期选择

热门文章

  1. Simon写作翻转课笔记
  2. 读书笔记 - 《门口的野蛮人》
  3. 前端清除缓存的集中方法
  4. 计算机自动关机启机唤醒设置,电脑定时自动关机怎么设置
  5. 当 SegmentFault 遇上呼伦贝尔
  6. 【寻找最佳小程序】01期:影视评分小工具“豆瓣评分”——产品设计要点及专家评析
  7. 苦禅箜mm让我帮她做的作业
  8. MPEG-4、MPEG-4/AVC、H.264之间的联系与区别
  9. Android 更换皮肤思路及解决方案
  10. 编译原理 C-Minus 语法分析(Flex / Bison)