隱寫術(shù):如何正確保護(hù)文章的版權(quán)?
首先,我們來(lái)看一段文字:
一我日是一青技南是我一是個(gè)青每南天我更是新青的南欄我目是,青希南望我做是到青在南每我天是幾青分南鐘我讓是你青獲南得我提是高青。南
看完以后,你有什么想法?你會(huì)不會(huì)覺(jué)得我是自戀狂?神經(jīng)病?復(fù)讀機(jī)?臉滾鍵盤?
很好,那么再看下面這一句話:
一日一技是一個(gè)每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。
是不是正常多了?
但是如果我說(shuō)這兩段話,實(shí)際上是一樣的,你信不信?
現(xiàn)在有4個(gè)中文漢字:我是青南,首先介紹Python的ord函數(shù),它可以查詢Unicode字符對(duì)應(yīng)的Unicode碼
- >>> ord('我')
- 25105
- >>> ord('是')
- 26159
- >>> ord('青')
- 38738
- >>> ord('南')
- 21335
接下來(lái),介紹另一個(gè)函數(shù)chr。它的作用是把Unicode編碼轉(zhuǎn)換為Unicode字符。
例如:
- >>> chr(21335)
- '南'
- >>> chr(38738)
- '青'
最后,介紹bin函數(shù),它可以把十進(jìn)制數(shù)字轉(zhuǎn)換為二進(jìn)制數(shù)字:
- >>> bin(6)
- '0b110'
- >>> bin(57)
- '0b111001'
以上就是本文涉及到的全部知識(shí)。下面,開(kāi)始轉(zhuǎn)換。
由于Unicode是十進(jìn)制數(shù)字,那么就能進(jìn)一步轉(zhuǎn)換為二進(jìn)制數(shù)字:
- >>> bin(25105)
- '0b110001000010001'
把前面的0b去掉:
- >>> bin(25105)[2:]
- '110001000010001'
那么,我是青南轉(zhuǎn)換為二進(jìn)制以后,分別為:
- >>> for char in '我是青南':
- ... print(char, bin(ord(char))[2:])
- ...
- 我 110001000010001
- 是 110011000101111
- 青 1001011101010010
- 南 101001101010111
那么原來(lái)那個(gè)看起來(lái)很混亂的句子是怎么生成的呢?
- from itertools import cycle
- signature = '我是青南'
- text = '一日一技是一個(gè)每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。'
- complex_text = ''
- for word, sig in zip(text, cycle(signature)):
- complex_text = complex_text + word + sig
- print(complex_text)
運(yùn)行效果如下圖所示:
那么如果把我是青南先轉(zhuǎn)換為他們對(duì)應(yīng)的二進(jìn)制字符串,然后再穿插到原文中,效果就會(huì)變成這樣:
- from itertools import cycle
- signature_bin_list = ['110001000010001',
- '110011000101111',
- '1001011101010010',
- '101001101010111']
- text = '一日一技是一個(gè)每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。'
- complex_text = ''
- for word, sig in zip(text, cycle(signature_bin_list)):
- complex_text = complex_text + word + sig
- print(complex_text)
運(yùn)行效果如下:
到目前為止,你肯定不知道我在干什么。
下面,我將會(huì)介紹兩個(gè)神奇的數(shù)字:
- 8204
- 8205
如果我使用chr把這兩個(gè)數(shù)字轉(zhuǎn)換為Unicode字符會(huì)怎么樣?
我們來(lái)試一試:
很奇怪對(duì)吧?什么東西都沒(méi)有?難道這兩個(gè)數(shù)字轉(zhuǎn)換為Unicode字符以后,都是空格??
沒(méi)事,我們把字符串形式的二進(jìn)制數(shù)字中的1替換為chr(8204),把0替換為chr(8025)
- from itertools import cycle
- signature_bin_list = ['110001000010001',
- '110011000101111',
- '1001011101010010',
- '101001101010111']
- text = '一日一技是一個(gè)每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。'
- 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)
運(yùn)行效果是什么樣的?請(qǐng)看下面這張圖:
奇奇怪怪的符號(hào)沒(méi)有了,一切都變得干干凈凈,就像下面這樣:
一日一技是一個(gè)每天更新的欄目,希望做到在每天幾分鐘讓你獲得提高。
現(xiàn)在,你在電腦上把這一段話復(fù)制下來(lái),存到記事本里面,效果如下圖所示:
看起來(lái)很正常對(duì)吧。那么現(xiàn)在,用vim把它打開(kāi),你看到的將會(huì)是這樣的:
在網(wǎng)頁(yè)上面,一切都正常,但是一旦有人復(fù)制了你的內(nèi)容,直接轉(zhuǎn)載到了它自己的網(wǎng)站上。那么你可以到法院去起訴他了,因?yàn)檫@些沒(méi)有寬度的符號(hào),就是證據(jù)。
在下一次的文章中,我將會(huì)講到,如何把本文的過(guò)程你過(guò)來(lái),把隱藏的信息提取出來(lái)。
本文轉(zhuǎn)載自微信公眾號(hào)「未聞Code」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系未聞Code公眾號(hào)。