【步兵 经验篇】图片加密之我见 by EOS.

现在apk满大街飞,直接下载一个apk改后缀名为rar,就可以看到里面的东西,我相信大家都知道,
也就是说,如果资源不加密的话,游戏的美术资源就成了别人的换皮对象=。=
现在淘宝上5块钱一堆资源,美术大大们,如果看到自己的资源被当烂白菜,不知道什么心态。

不过就算加密了,也有人去研究解密,对解密这块我也不是太懂,感觉这是一个门高深的技术=。=
下面我就来说一个我用过的一个比较简单的图片加密方法。

PNG加密

先说一下思路:
首先要了解png二进制的前8位是PNG的文件标识,那么我破坏这个文件图片标识,
它就算被的加密了,最起码你用图片查看工具识别不出来了。
(比如png改成开封菜~)

从最简单的出发的,想到的可能就是改值或者换位,而我的加密就是基于这两点。
(ps:完全没用加密算法,不行了,感觉自己好low)

const char pngStart[16] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52 };//89 50 4E 47 0D 0A 1A 0A 00 00 00 00 49 48 44 52
const char pngEnd[12] = { 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 };//00 00 00 00 49 45 4E 44 AE 42 60 82//每一位都可以是 0x00~0xff,这里用字符串偷懒了=。=
char pngStartChange[16] = "what~the#fuck!e";//[15] = s
char pngEndChange[12] = "oh@my%god`e";//[11] = s

png二进制流的前16位和后12位是固定的,我们把它全部干掉,然后再打乱顺序。
因为替换字符串的可以是任意的,而且又有将近30位的排列组合,我感觉加密的可行性还是很高的。
(ps:求打脸 =3= ,因为不太懂解密。)

int index = 2;
for (int i = 0; i < 16; i++)
{if (i % 2 == 0){++index;swap(buf[i], buf[size - size / index]);}else{swap(buf[i], buf[size / index]);}
}
for (int i = 1; i <= 12; i++)
{auto c = buf[size - i];swap(buf[size - i], buf[15 + i*2]);
}

换位方式用了两种,一种是根据size,也就是图片流的大小,另一种是固定索引。
前者感觉就是感觉变数更多一些,因为每个文件大小不一样,而且换法也很多。
后者就算简单粗暴了,不过IDHR算是比较重要的所以把它也破坏掉。

文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。

经过上面的处理,我感觉我们数据流已经够复杂了,基本上已经和图片没什么关系了。
他很难知道我们篡改后的字符是什么,所以他很难换位回来。而且我们换位也是有技巧的=。=

PNG解密

解密当然就是上面的加密的逆操作,就是换回来,然后再替换回原来的png头和尾部。

是不是感觉好简单啊~ 所以这里就需要特殊的换位技巧了=。=
(ps:如果你换位的奇技淫巧!请告诉我~)

而且我们操作很简单,所以解密效率自然是杠杠的。

源码

下面是我测试用的demo源码,仅供参考。

/************************************************************************/
/* 文件名称: main.cpp                                                   */
/* 简要描述:图片加密解密Demo                                           */
/*                                                                      */
/* 创建日期:忘球了                                                     */
/*                                                                      */
/* 作者:EOS.                                                           */
/************************************************************************/
#include <iostream>
#include <fstream>
using namespace std;const char pngStart[16] = { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A, 0x00, 0x00, 0x00, 0x0D, 0x49, 0x48, 0x44, 0x52 };//89 50 4E 47 0D 0A 1A 0A 00 00 00 00 49 48 44 52
const char pngEnd[12] = { 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4E, 0x44, 0xAE, 0x42, 0x60, 0x82 };//00 00 00 00 49 45 4E 44 AE 42 60 82char pngStartChange[16] = "what~the#fuck!e";
char pngEndChange[12] = "oh@my%god`e";class PNGTransform
{
public:PNGTransform(fpos_t s):size(s) {buf = new char[size];};~PNGTransform() {delete[] buf;};//神一样的解说:构造析构防测漏void transform() {for (int i = 0; i < 16; i++){buf[i] = pngStartChange[i];}for (int i = 1; i <= 12; i++){buf[size - i] = pngEndChange[12-i];}int index = 2;for (int i = 0; i < 16; i++){if (i % 2 == 0){++index;swap(buf[i], buf[size - size / index]);}else{swap(buf[i], buf[size / index]);}}for (int i = 1; i <= 12; i++){auto c = buf[size - i];swap(buf[size - i], buf[15 + i*2]);}ofstream fout;fout.open("./mLS07.png", ios::binary);fout.write(buf, size);fout.close();};public:char* buf;fpos_t size;
};class PNGRestore
{
public:PNGRestore(fpos_t s) :size(s) {buf = new char[size];};~PNGRestore() {delete[] buf;};void restore() {for (int i = 1; i <= 12; i++){swap(buf[size - i], buf[15 + i * 2]);}//逆序防止 123 213 231 -》 231 321 321 的情况int index = 11;for (int i = 15; i >= 0; i--){if (i % 2 == 0){swap(buf[i], buf[size - size / index]);}else{index--;swap(buf[i], buf[size / index]);}}for (int i = 0; i < 16; i++){buf[i] = pngStart[i];}for (int i = 1; i <= 12; i++){buf[size - i] = pngEnd[12 - i];}ofstream fout;fout.open("./rLS07.png", ios::binary);fout.write(buf, size);fout.close();};public:char* buf;fpos_t size;
};template<class T>
fpos_t GetFileSize(T& fs)
{fs.seekg(0, ios::end);auto fileSize = fs.tellg().seekpos();fs.seekg(0);return fileSize;
}int main()
{pngStartChange[15] = pngEndChange[11] = 's';
#define PNGTRANSFORM  0
#define PNGBUFCHECK 0#if PNGTRANSFORM == 1ifstream fin;fin.open("LS07.png", ios::binary);auto fileSize = GetFileSize(fin);PNGTransform trans(fileSize);fin.read(trans.buf, fileSize);fin.close();trans.transform();
#elseifstream fin;fin.open("mLS07.png", ios::binary);auto fileSize = GetFileSize(fin);PNGRestore reset(fileSize);fin.read(reset.buf, fileSize);fin.close();reset.restore();
#endif#if PNGBUFCHECKifstream fin;fin.open("LS07.png", ios::binary);auto fileSize = GetFileSize(fin);PNGTransform trans(fileSize);fin.read(trans.buf, fileSize);fin.close();fin.open("rLS07.png", ios::binary);fileSize = GetFileSize(fin);PNGRestore reset(fileSize);fin.read(reset.buf, fileSize);fin.close();reset.restore();fpos_t xx = 0;while (xx < reset.size){if (reset.buf[xx] != trans.buf[xx]){break;}xx++;}
#endifsystem("pause");return 0;
}

如果觉得此可行,请参考代码自行修改。

See Again~
之前
真爱无价,欢迎打赏~

【步兵 经验篇】图片加密之我见相关推荐

  1. 【步兵 经验篇】组件模式的特点

    [步兵 经验篇]组件模式的特点 by EOS. 组件模式对u3d的开发者可能并不陌生,因为其框架设计大量的使用了这种模式, 但是cocos却没有使用,不过后来出的js也开始套用这种模式,他能被效仿,自 ...

  2. 【步兵 经验篇】断点续传

    [步兵 经验篇]断点续传 By EOS. 虽然 基于cocos写的,但是也可以用于其他地方,核心是curl库,只要引用就可以实现. 既然curl库本身是有断点续传的接口的,不用岂不可惜? 用途 断点续 ...

  3. 混沌加密算法python_基于混沌Logistic加密算法的图片加密与还原

    摘要 一种基于混沌Logistic加密算法的图片加密与还原的方法,并利用Lena图和Baboon图来验证这种加密算法的加密效果.为了能够体现该算法在图片信息加密的效果,本文还采用了普通行列置乱加密算法 ...

  4. 【步兵 工具篇】lzma算法,压缩字节流

    [步兵 工具篇]lzma算法,压缩字节流 by EOS. 本来上周就打算写的,不过孩子连续高烧,住院了一个礼拜.一个礼拜没回家,还写什么博客. 虽然花了不少钱,好在孩子也恢复过来了,继续努力,挣钱养家 ...

  5. 关于身份证图片加密安全技术

    前言 现在的图片都是上传到c d n或者其它第三方服务器上,通过一个url进行访问,非常的方便,方便的同时也带来了另外一个问题,隐私安全问题,比如:好莱坞隐私照片泄漏. 如何保证图片安全 如果发生客户 ...

  6. python简单的图片加密

    欢迎加入我们卧虎藏龙的python讨论qq群:729683466 ●导 语 ● 总有些东西是你不希望别人看到的 比如 你暗恋的女神的照片 要是被别人发现了 那可就尴尬了 所以 来学一学用python加 ...

  7. 倩女幽魂2服务器维护怎么抢先进,玉玉倩女幽魂新区攻略-经验篇

    玉玉已经发表过一篇新区升级的攻略了. 可以让普通玩家只花一块钱,轻轻松松的到达69级. 练级篇里面提到了60级做一条布袋,很多人可能不满意获得的经验. 这次这篇可以让经验再次扩大,多到开封印就可以秒8 ...

  8. 实现图片打乱_基于混沌Logistic加密算法的图片加密与还原

    基于混沌Logistic加密算法的图片加密与还原 摘要 一种基于混沌Logistic加密算法的图片加密与还原的方法,并利用Lena图和Baboon图来验证这种加密算法的加密效果.为了能够体现该算法在图 ...

  9. 极验验证码流程-3.图片加密处理 图片移位

    终于把图片加密给搞定了,原理是他把图分成了52个部分,然后通过移动来形成新的图片 主要的位置关系看代码 顺便吐槽下ruby,小众语言就是这么不方便,很多库都没有,百度了半天 最后换成了java来写 图 ...

最新文章

  1. LeetCode简单题之图片平滑器
  2. Android的一些属性使用
  3. npm install 报错: WARN checkPermissions Missing write access to 解决方案
  4. iptable 命令
  5. 使用sklearn来处理类别数据
  6. 小编带你了解oracle使用索引和不使用索引性能分析
  7. 安卓app 获取view的id_隐私保护问题不小 研究表示1325个安卓APP未经授权获取用户数据...
  8. 教程-上传应用公钥并获取支付宝公钥
  9. java中的html标签位置,Java 过滤所有html标签,复制文件到指定位置
  10. 写日历的程序员,你必须弄懂的中国农历算法。
  11. su、sudo、sudo su、sudo -i的用法和区别
  12. 读书日当天冲上销量榜Top1和Top3,来听听携程人写书背后的故事
  13. 计算机病毒有几个阶段,计算机病毒发展9阶段
  14. Python编写杨辉三角形
  15. 计算机雕刻教学设计,综合实践《果蔬雕刻》教学设计第一课时
  16. 网络子系统33_网桥设备的配置更新
  17. nimg 文件服务器 部署,RHEL6.5 部署DNS服务器
  18. 不是广告!!迎来1w粉丝,本号送书啦!|原创
  19. 新版本jdk(9、11、12、13、14)特性
  20. 自从有了BI商业智能系统,再也不用担心我的作图了!!!(图文)

热门文章

  1. Android 浏览器分享到APP
  2. r语言 html表格,R语言 | 教会你用R制作漂亮的表格 (全网最全的方法)
  3. mysql中家庭关系_家庭数据库是什么
  4. win10、oneplus7pro 使用 Kali
  5. python :no moudle named pil
  6. 瑜伽教学法 | 在瑜伽老师这条路上我们都迷茫过,你是否也想过要放弃
  7. 分布式接口幂等性的实现
  8. kcf 跟随_KCF追踪方法流程原理
  9. 面向程序员的数据挖掘指南-----第三章:隐式评价和基于物品的过滤算法
  10. 深度学习-基础镜像发布系列