新人第一帖,最近整的一个小玩意儿不知道这里有没有人感兴趣()
随机空间填充曲线图片混淆 https://kjtctphx.netlify.app/
示意图

省流:这是一个用(密钥控制的)随机空间填充曲线,来对图片像素的位置进行混淆的程序。这种混淆方法能够保持像素的空间相关性,从而被有损压缩后仍能以较好质量还原
下面更详细地讲一讲
大约2020年时,贴吧里有个叫picencrypt的安卓软件比较火。这个软件的功能是将一张图片的所有像素随机排列变成一张新的图片(软件里称为混淆),然后再可逆地变回去(称为解混淆)。混淆后的图根本看不出来原图的任何形状,可以用来逃避审核。这下知道为什么火了
picencrypt 例子

(不过现在搜picencrypt搜出来的都是网页版,源头是我()当时我还在上高中,正是中二的年纪,对这个很感兴趣,找到了安卓软件的源码,把混淆逻辑用js重写,然后发在网上,这样只要有浏览器就能用了,然后就传得到处都是)
不过picencrypt有一个很大的缺点,就是不抗有损压缩。网上传输图片时,相对于文字的一个关键不同点,是图片经常会被有损压缩。如果picencrypt的混淆图被有损压缩,其颜色会极大的劣化,解混淆效果很糟糕。若为防止压缩而发送png图片,则大小又太大。这样看来picencrypt实用性还不够高
不严谨地说,有损压缩相当于低通滤波相当于模糊操作。picencrypt的算法太简单,在picencrypt的混淆图中,离得近的像素在原图中可能距离很远,对其进行有损压缩,会导致每个像素掺杂了来自整张图片各处的颜色。
而我做的这个图片混淆中,离的近的像素在原图中大概率离得近,对其进行有损压缩,每个像素接受到的颜色在原图中也大概率来自附近,从而质量损失更小,抗有损压缩能力比picencrypt强不少
在二次元图片中效果更明显,可以看到原图中的大块颜色在混淆图中仍然连成几片。同时混淆图中仍然看不出原图的任何形状
随机空间填充曲线图片混淆例子

这个混淆算法就是生成一条空间填充曲线,让像素沿着这条曲线移动一段距离即可。空间填充曲线,如希尔伯特曲线,是从线段到平面区域的连续满射,自然地就具有曲线上相近的点在平面区域上也相近的特点。于是先映射到曲线,再移动,再映射回来,能够保持一定的空间相关性
高中时候我就想用空间填充曲线实现抗压缩图片混淆,但是当时只知道希尔伯特曲线,只能用于边长为2的幂的图片而非任意图片。后来有天在github上看到了个叫gilbert的适用于任意矩形的填充曲线,于是改改拿来用了,做了个叫“小番茄”的图片混淆,没错这个源头还是我()然后最近发现gilbert里的参数好像随便调效果也不会太差,可以引入一个伪随机数流来控制参数,实现随机空间填充曲线,于是就有了这个随机空间填充曲线图片混淆。伪随机数生成器是随便选的,很不密码学安全,就是玩玩()