这几天忙于毕业论文,今年的论文需要查重,重复率需要低于20%,身边的好几个同学都在讨论怎么降低重复率。虽然这种学术不端的事情我不是很喜欢干,但是光作为一种技术讨论应该还是可以的。

吹逼途中,忽然想起近期兴起的一种反爬虫技术,其原理是通过替换页面中的一些高频文字,将他们替换为其他文字,然后使用自定义的字体将其正确显示。这样,如果使用机器直接读取源文件,读出来的就是加密过的文本。我们能不能也在文档里面用同样的技术实现呢?

免责声明

本文的目的仅在于讨论一种可能的文档反机械识别的技术,作者不赞成将此技术应用于论文降重。学术不端行为后果自负。

原理

前面已经说了,这项技术的原理是制造一个特殊的字体,将字符重新映射。比如:

字符编码 显示字符

上表给出了一个简单的字符映射。我们制作一个这样的字体,输入“你好吗”后就会显示为“测试中”。
但是,如果将上面的文本复制用其他字体显示,那么就还是显示为“你好吗”,而不是“测试中”。

这就是前面的反爬虫原理。我们仅需制造一个这样的映射表,按映射表将一个指定字体里面的字符映射打乱,就可以获得一个这样的特殊字体了。

实现

Python有个工具箱叫做fonttools,里面的ttx工具可以将ttf/ttc字体转换为ttx格式的文件。ttx文件实质上是一个xml文件,里面存储着所有字体的字型(glyph)和字体映射(cmap),我们仅需使用xml读写工具修改cmap中对应项目的值,将他们重新映射并保存。最后再使用ttx将修改完毕的ttx文件转换回ttf/ttc格式。

具体的代码实现见 Github

测试

这里提供了一份编译好的程序和转换好的字体可供下载测试。(https://pan.baidu.com/s/1b8-Vm4cKaN5uzI3gU7kHxg 提取码: kxkv)

首先安装修改后的字体,然后在word中使用它。你会发现输入的字体和显示的不一样,这时候就需要用到上面一并提供的转换工具对文本进行转换。将转换后的乱码输入word中,你会发现它显示正常了。
将word选项中的嵌入文档字体打开,这样这个特殊的字体就会被嵌入文档中,在没有安装这份字体的电脑上也可以正确的显示。
现在,一份机器不可读的文档就制造完成了。你可以试试将这些文字复制到其他普通的程序中,你会发现全都是乱码。这样,我们的目标就完成了。

分类: 折腾

发表评论

电子邮件地址不会被公开。 必填项已用*标注