天天看點

百度網盤禁止部分海外環境的使用者上傳的方式上傳加密壓縮包?

作者:王叔侃侃談

讓我們快進到隻能上傳文本和圖檔。

是以啊同學們,知識改變命運,以前我就一直說,人人都有小秘密,你的好兄弟好閨蜜可能會騙你哦,你的男朋友女朋友可能會騙你哦,你的親戚朋友也可能會騙你哦。但是啊數學不會,《資訊論》也不會,因為不會就是不會。

假如以後有一天啊,網盤和各大平台一樣,隻能上傳文字和圖檔,怎麼辦?

不要慌,偉大的香農煮師爺會來拯救你。

百度網盤禁止部分海外環境的使用者上傳的方式上傳加密壓縮包?

我們先來明确一個概念。

文字和圖檔,都是資訊的載體,不論是程式,文字,圖檔,視訊都是一種資訊的載體,在二進制的數字編碼方式中,資訊并沒有什麼差別,無非是解碼意義上有所不同。

是以,理論上有載體,我們就能編碼任意資訊,是以即使快進到隻能發文字和圖檔,我們照樣可以通過某種編碼與解碼的手段,把任意的資料編碼到圖檔裡。

在這之前,我們先來聊聊某種“過時技術”江湖人稱“圖種”,它的原理非常的簡單,簡單來說就是在圖檔檔案尾部附加額外的資料

因為大多數圖檔格式有明确的邊界檢查,是以在圖檔檔案尾部附加資料,并不會影響圖檔檔案的解碼,圖檔仍然能夠正常顯示,同時因為平台程式員比較偷懶,沒有檢查檔案是否有附加額外的資料,是以這種圖種能夠生效,但是目前各個平台會在上傳的圖檔中添加水印并重新編碼圖檔,是以,這種方式在多數平台都已經無效了,但總的來說,這和我之後要聊的編碼與解碼沒啥關系,是以這裡我說這個的意思是:

不要在評論裡刷什麼圖種了,不是一回事!

那我們接下來要聊的,就是如何把資料編碼進圖檔裡,關于這部分,我們需要分兩部分進行讨論,第一部分是無損編碼。比如我們經常用的PNG檔案,它就非常好了解,一個PNG檔案頭部,剩下的資料為Block(或者叫chunk),每個Block由deflate算法進行編解碼(inflate/deflate),這個算法和zip壓縮包的算法幾乎如出一轍,是以,png圖檔檔案你可以了解為"圖檔用ZIP壓縮了一下"

因為PNG圖檔有alpha通道,支援A8R8G8B8格式,是以,其每一個像素可以編碼4個位元組的資料,也就是說,在一個512x512的圖檔裡,我們至少(注意我用的是至少,因為PNG本身是壓縮格式,實際編碼容量很可能大于這個大小)可以編碼1M的資料,我們要做的事情也非常的簡單,直接将資料拷貝到像素資料裡,然後再用png的編碼方式打包起來就可以用了.

舉個栗子,下面這張圖檔其實是一部非常好康的視訊經過編碼後的圖檔,那麼你猜猜這部電影是什麼(下面這張不用下載下傳了,知乎會将回答中釋出的PNG重新編碼為JPG格式,是以我會在評論區再發一次,下面這個編碼已經被JPG壓縮破壞了)?

無損壓縮固然好,但是也有其缺陷,比如其魯棒性太低了,任何對圖檔的幹擾就會破壞資料的完整性,同時,大多數平台普遍使用JPG格式圖檔,這是一種基于DCT域的有損壓縮格式,每張圖檔被劃分為若幹個8x8的MCU塊,這個8x8的MCU再經過二維DCT變換乘以一個DQT矩陣(相當于低通濾波器)後壓縮編碼尺寸,最後通過和PNG類似的範式Huffman編碼進行無損壓縮.

可能有人會說,既然如此,我們也不管JPG的怎麼壓縮了,我們能不能直接把資料編碼到JPG Huffman無損壓縮前的資料區,這樣我們就能繞過頻域壓縮部分,直接把編碼的信道容量拉滿,這是一個很好的想法,但是,不行,為什麼?

  1. 不僅僅在DCT->DQT頻域壓縮中存在資訊損失(或者叫能量損失),在RGB-YUV顔色空間的轉換過程,DCT->IDCT間的過程,都可能存在因為浮點精度損失導緻的能量損失,是以,隻要圖檔經過了JPG的再編碼,資料就有可能是損耗的,在各個平台對圖檔加水印後,資料就很有可能被損壞了.
  2. 事實上JPG的編碼與解碼器的實作并沒有一個确切的算法實作标準,它不像PNG那樣,不管你中間過程的算法怎麼寫,解出來的資料是不會變的,但JPG不是,其數學算法在精度上的略微差異,就能導緻不同編碼器解碼器解碼的資料不一緻,當然,盡管解碼出來的圖檔看上去都差不多.
  3. 不同平台預設的DQT再編碼矩陣是未知的,也就是說你一個品質為100的圖檔上傳上去,下載下傳後因為再編碼,到手就隻有75了,資料肯定是被破壞了.

是以,事情變得稍微棘手起來,我們迫切需要某種具有更強的魯棒圖像,對顔色資料進行編碼,它能抵擋住JPG的不同品質矩陣的有損壓縮攻擊和算法導緻的精度損失攻擊,于是這個事情很可能就變成了,我們如何在一個8x8 MCU中編碼盡可能多的比特,還是在信噪比不确定的情況下(将低通濾波精度損失幹擾視作噪聲)

為此,我們可以學習了一下QR code的編碼方式,觀察下圖,這是兩個方塊,每個方塊都是二值化的,也就是純白是1,純黑是0

也就是說,1個方塊可以編碼1個bit,如果我們将這個顔色用波形的方式表達,那麼按道理來說,它應該是一個方波信号,衆所周知,DCT變換公式如下

F(u)=c(u)\sum_{x=0}^{N-1}{f(x)cos[\frac{(x+0.5)\pi}{N}u]}

其以餘弦函數為基底,那麼如果我們對其進行低通濾波,顯然方波中的"高頻"會洩漏到正弦波的"低頻"中,是以,如果我們将DQT與精度損失都視作低通濾波,則其能量會以類似的方式"洩漏"

是以,如果我們用二值化的方式進行編碼,然後解碼時用"四舍五入"的方式進行解碼,理論上這種抗幹擾能力還是挺強的,應該抗的住JPG壓縮的攻擊.

顯然的,我們還可以更進一步,JPG的壓縮幹擾顯然比屏攝這種噪聲幹擾輕得多,是以,我們可以将每個方塊編碼成4種狀态,即如果灰階值是0-255,那麼

0-42 編碼為 0

43-127 編碼為 1

127- 210 編碼為 2

210-255 編碼為3

這樣我們每個方塊可以編碼2個bit,最後,每個方塊應該多少個像素呢,顯然的,根據香農采樣定律的2倍關系.一個8x8的MCU,應該編碼為4x4的方塊會比較合适,也就是說,每個8x8的MCU,我們可以編碼32個bit.

依據這個理論,我們将這種編碼格式稱作抗jpg壓縮編碼,同樣的,下面這張圖檔其實也是一部非常好康的視訊經過抗JPG壓縮編碼後的圖檔,下面這圖可以直接點開大圖後完整解碼,你想康麼?

最後,附上應用:

DBinary的想法 https://www.zhihu.com/pin/1641580751048249344

源碼在這

基于PainterEngine歡迎點Star

==================================================

有同學問,加水印怎麼辦,不用慌,我專門在下方留了打水印的空間,是以圖檔解碼不受影響。

我知道又有同學問,要是我整個圖檔都打上水印呢?嘿嘿,問題不大,隻要思想不滑坡,辦法總比困難多,時域抗幹擾能力不強,我們可以把資訊編碼到頻域嘛,比如下面圖檔,我把我的ID刻在了圖檔的頻域上

圖k.6

然後為了看看其抗幹擾能力,分别使用裁剪,塗抹,攻擊并檢視攻擊後水印的保留效果。

裁剪攻擊與其頻譜

平移攻擊及其頻譜

高斯噪聲與頻譜

塗抹攻擊與頻譜

=====================================================

繼續閱讀