先放网址和效果图: https://jpgcrypt.github.io/ (使用前的注意事项: 请阅读网页里面的说明。)
效果图中,最上一幅为原图。中间左侧和右侧分别是使用彩色和黑白模式加密后的结果(缩小 50%)。最下面一幅是黑白的加密结果应用 JPEG 压缩后(质量 10%)再解密出来的样子。

为什么要这么做,这算什么加密?
当代的密码算法,可以在数据的层次上实现非常好的保密。但是,这样的各类算法都是针对数字化的「数据」设计的。无论文件本身是图像还是文本,加密之后都成为了看似随机的数据,既不是图像也不是文本了。
有的时候可能需要利用原有的途径传送加密后的结果。如果可以让图像加密之后还是图像,就可以利用各种发送图像的手段(网站、软件、服务……)直接传送,达到保密的目的,也无需另起炉灶。
jpgcrypt 这个工具,把图片打散成 8x8 尺寸的马赛克,然后借助密码算法生成的伪随机序列( SHA-512 和 Salsa20 的函数)将所有的马赛克乱序重排,并施以伪随机的变换(旋转 90 度、水平和垂直镜像)。要将马赛克恢复原样,需要重新构建这一序列,即得知一开始加密时使用的密码。虽然不借助这一办法也有恢复(破解)的可能,但这一过程相信也是比较费时的。
因为加密(打散)和解密(恢复)的过程几乎只和图片的尺寸以及用户提供的口令有关,所以这个算法不依赖于图像本身的质量(不太严格,下面会讲),只要图片尺寸正确,口令正确,就可以恢复出内容上大致正确的原图。在传输过程中图片经历压缩、降低质量,也会影响解密图片的质量,但还是可以恢复出来的。
本加密工具的特点
- 是一个运行在浏览器上的工具,加解密不依赖服务器后台。未来将推出浏览器插件,更方便使用。
- 同一个密码加密同一个图片,结果不相同。*
- 加密结果,即使经历轻度的尺寸缩放和图片压缩,仍然可以解密。
*: 为了达到这个目的,加密图片时进行了两次混淆。第一次混淆使用用户口令+随机参数,后者在第二次混淆前记录在图片上。如果图片失真过于严重,还是有机会解密失败。
欢迎测试这个工具,告诉我各种不足之处 :)