7

隐写术:如何正确保护文章的版权?

 3 years ago
source link: https://mp.weixin.qq.com/s?__biz=MzI2MzEwNTY3OQ%3D%3D&%3Bmid=2648980126&%3Bidx=1&%3Bsn=0e56b6e30f22641dc2c96c0705822d9e
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

yIj2Enu.png!mobile

摄影:产品经理

锅贴

首先,我们来看一段文字:

一我日是一青技南是我一是个青每南天我更是新青的南栏我目是,青希南望我做是到青在南每我天是几青分南钟我让是你青获南得我提是高青。南

看完以后,你有什么想法?你会不会觉得我是自恋狂?神经病?复读机?脸滚键盘?

很好,那么再看下面这一句话:

一‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌日‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌一‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍技‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌是‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌一‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌个‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍每‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌天‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌更‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌新‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍的‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌栏‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌目‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌,‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍希‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌望‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌做‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌到‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍在‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌每‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌天‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌几‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍分‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌钟‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌让‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌你‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍获‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌得‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌提‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌高‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍。‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌

是不是正常多了?

但是如果我说这两段话,实际上是一样的,你信不信?

现在有4个中文汉字: 我是青南 ,首先介绍Python的 ord 函数,它可以查询Unicode字符对应的Unicode码

>>> ord('我')
25105
>>> ord('是')
26159
>>> ord('青')
38738
>>> ord('南')
21335

接下来,介绍另一个函数 chr 。它的作用是把Unicode编码转换为Unicode字符。

例如:

>>> chr(21335)
'南'
>>> chr(38738)
'青'

最后,介绍 bin 函数,它可以把十进制数字转换为二进制数字:

>>> bin(6)
'0b110'
>>> bin(57)
'0b111001'

以上就是本文涉及到的全部知识。下面,开始转换。

由于Unicode是十进制数字,那么就能进一步转换为二进制数字:

>>> bin(25105)
'0b110001000010001'

把前面的 0b 去掉:

>>> bin(25105)[2:]
'110001000010001'

那么, 我是青南 转换为二进制以后,分别为:

>>> for char in '我是青南':
...  print(char, bin(ord(char))[2:])
...
我 110001000010001
是 110011000101111
青 1001011101010010
南 101001101010111

那么原来那个看起来很混乱的句子是怎么生成的呢?

from itertools import cycle

signature = '我是青南'
text = '一日一技是一个每天更新的栏目,希望做到在每天几分钟让你获得提高。'
complex_text = ''
for word, sig in zip(text, cycle(signature)):
    complex_text = complex_text + word + sig
print(complex_text)

运行效果如下图所示:

aEvqQrF.png!mobile

那么如果把 我是青南 先转换为他们对应的二进制字符串,然后再穿插到原文中,效果就会变成这样:

from itertools import cycle

signature_bin_list = ['110001000010001',
                      '110011000101111',
                      '1001011101010010',
                      '101001101010111']
text = '一日一技是一个每天更新的栏目,希望做到在每天几分钟让你获得提高。'
complex_text = ''
for word, sig in zip(text, cycle(signature_bin_list)):
    complex_text = complex_text + word + sig
print(complex_text)

运行效果如下:

AVbqeqe.png!mobile

到目前为止,你肯定不知道我在干什么。

下面,我将会介绍两个神奇的数字:

如果我使用 chr 把这两个数字转换为Unicode字符会怎么样?

我们来试一试:

JzQNzyz.png!mobile

很奇怪对吧?什么东西都没有?难道这两个数字转换为Unicode字符以后,都是空格??

没事,我们把字符串形式的二进制数字中的 1 替换为 chr(8204) ,把 0 替换为 chr(8025)

from itertools import cycle

signature_bin_list = ['110001000010001',
                      '110011000101111',
                      '1001011101010010',
                      '101001101010111']
text = '一日一技是一个每天更新的栏目,希望做到在每天几分钟让你获得提高。'
complex_text = ''
for word, sig in zip(text, cycle(signature_bin_list)):
    complex_text = complex_text + word + sig.replace('1', chr(8204)).replace('0', chr(8205))
print(complex_text)

运行效果是什么样的?请看下面这张图:

y2yeeuF.png!mobile

奇奇怪怪的符号没有了,一切都变得干干净净,就像下面这样:

一‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌日‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌一‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍技‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌是‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌一‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌个‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍每‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌天‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌更‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌新‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍的‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌栏‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌目‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌,‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍希‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌望‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌做‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌到‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍在‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌每‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌天‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌几‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍分‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌钟‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌让‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌你‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍获‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌得‌‌‍‍‍‌‍‍‍‍‌‍‍‍‌提‌‌‍‍‌‌‍‍‍‌‍‌‌‌‌高‌‍‍‌‍‌‌‌‍‌‍‌‍‍‌‍。‌‍‌‍‍‌‌‍‌‍‌‍‌‌‌

现在,你在电脑上把这一段话复制下来,存到记事本里面,效果如下图所示:

YBFvMbu.png!mobile

看起来很正常对吧。那么现在,用vim把它打开,你看到的将会是这样的:

ZNJZN3N.png!mobile

在网页上面,一切都正常,但是一旦有人复制了你的内容,直接转载到了它自己的网站上。那么你可以到法院去起诉他了,因为这些没有宽度的符号,就是证据。

在下一次的文章中,我将会讲到,如何把本文的过程你过来,把隐藏的信息提取出来。

感谢机械工业出版社的赞助,文末送出4本《从零开始学Selenium自动化测试(基于Python·视频教学版)》。本书基于Python语言,系统地介绍了Selenium自动化测试的相关知识及应用。书中的大部分知识点都匹配了可独立运行的典型实例,便于读者学习与实践。另外,为了帮助读者更加高效、直观地学习,本书特意提供了约10小时基础操作配套教学视频。相信读者通过系统地学习本书内容,可以全面掌握Selenium 3自动化测试技术。

7ruANvN.png!mobile

j6VVnai.gif!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK