Qt下图片加密的两种方式
目录
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下图片加密的两种方式相关推荐
- 实现Windows下Qt扫描U盘的两种方式
参考网上资源,总结了如下实现Windows下Qt扫描U盘的两种方式:. 方式1: 检测Windows的事件–WM_DEVICECHANGE 缺点:想要检测时,必须发生过一次U盘插拔动作,需要手动&qu ...
- Python:实现图片裁剪的两种方式——Pillow和OpenCV
原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还 ...
- Python图片裁剪的两种方式——Pillow和OpenCV
本文参考Python图片裁剪的两种方式--Pillow和OpenCV并进行了一些更新 感谢作者:hfutdog 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一 ...
- python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV
在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...
- Python实现图片裁剪的两种方式——Pillow和OpenCV
在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. 首先,我们有 ...
- linux下安装mysql的方式_linux下安装mysql的两种方式
linux下安装mysql的两种方式 1 源码安装 1 创建mysql用户: useradd mysql passwd mysql 2 解压缩下载的mysql包: tar -zxvf mysql-5. ...
- Android点击图片随机,android 设置图片随机出现-两种方式
android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的id ivBg ...
- ubuntu下创建定时任务的两种方式及常见问题解决方案
ubuntu下创建定时任务的两种方式及常见问题解决方案 参考文章: (1)ubuntu下创建定时任务的两种方式及常见问题解决方案 (2)https://www.cnblogs.com/maboii/p ...
- SpringBoot 配置文件加密的两种方式
SpringBoot配置文件加密的两种方式 jasypt使用方式 用法一: 1.Application.java上增加注解@EnableEncryptableProperties(jasypt-spr ...
- Qt实现多线程编程的两种方式
Qt实现多线程编程的两种方式 方式一: 继承自QThread类,覆写run函数.此实现方法只有run函数内的代码是运行在子线程内. 代码示例: #ifndef QDEMOTHREAD_H #defin ...
最新文章
- 职场思想分享002 | 入职第一个月工资这样花,一年内工资至少再涨50%!
- Git 初始化及仓库创建及操作
- 【JavaScript】Document对象学习
- 《大道至简》第二章读后感
- HDOJ 1106 排序
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(二)之分库分表路由...
- 012-P2P加速Docker镜像分发(阿里Dragonfly)
- vue相关--自己看看的
- UninstallPKG for Mac(PKG文件卸载)
- 如何在Windows中将“显示桌面”图标移动到快速启动栏或任务栏
- 《十周成为数据分析师》笔记——业务线 第五节 用户画像体系
- java 获取Authorization信息
- Qt QString 增、删、改、查、格式化等常用方法总结
- matlab 路由表,闭关修炼之zigbee路由
- 办公室office工具————Word基础
- cad管道阀门符号dwg_cad管道阀门符号怎么画(CAD怎么画系统图,特殊符号怎么搞,像管道系统图,...)...
- 什么叫做ECS云服务器?
- China creates vast research infrastructure to support ambitious climate goals
- 生存or倒闭,区块链公司在2019年死磕的每一天 |链捕手
- 仿XP皮肤弹出式日期选择