我访问了这个网站, https://xcode.darkbyte.ru/
网站基本上将文本作为输入并生成图像。 它还将图像作为输入并将其解码回文本。 我真的想知道这是什么以及它是如何完成的 我想知道算法[最好用Java] 请帮助,提前致谢
答案 0 :(得分:3)
有很多方法可以将文本(字节序列)编码为图像,但是您引用的网站以非常简单和直接的方式进行编码。您可以轻松地对其进行逆向工程:
最多3个字符编码为1个像素; 4个字符作为2个像素 - 我们从中了解到每个像素只使用R(ed),G(reen)和B(lue)通道(而不是alpha /透明通道)。
我们知道PNG每通道支持8位,每个ASCII字符为8位宽。让我们测试第一个字符(前8位)是否存储在红色通道中。
z..
。由于z
在ASCII表格中相对较高(122
)且.
相对较低(46
),因此我们希望得到一个红色的1x1 PNG。我们这样做。.z.
。应该是绿色的..它是。..z
,我们会得到一个带蓝色的像素。现在让我们看看非ASCII输入会发生什么。尝试输入:①
(unicode char \u2460
)。网站html-encodes将字符串放入①
,然后像以前一样将ASCII文本编码到图像中。
压缩。输入大量文本时,我们注意到输出比预期的要短。这意味着后端在原始输入上运行一些压缩算法(或之后?)将其编码为图像。通过注意图像的分辨率和最大信息内容(HxWx3x8位)小于输入,我们可以得出结论,压缩是在编码到图像之前完成的,而不是在之后(因此不依赖于PNG压缩)。我们可以通过使用Huffman coding,Lempel-Zip,LZW,DEFLATE,甚至{{3}等常见罪犯对原始输入进行编码来进一步检测使用哪种压缩算法},并将输出与图像像素的字节进行比较。 (注意我们无法通过检查魔术前缀直接检测它,除了原始压缩数据之外,作者可能被剥离了。)