簡介
“平形”加密法——當事物失去特徵時,你將無法描述,也無從辨別。
文章中,當某些字被替換成不同的字後,你如何理解文章的內容?兩種可能:一是被誤導,二是不知所云。當大量常用的字都被替換了,你能有辦法復原文章的內容嗎?答案是:No passable!因為它很可能是另一篇文章。
加密原理
用一個字串(密鑰)循環平移文章中每一個字,使得有含義的文章變成無含義或它義的文字。由於平移後密文仍為正常的文字,所以密文仍可以像普通文本一樣正常傳輸、壓縮、甚至加密。[注]:這一般僅適用於字含義的加密,對於含有邏輯結構信息的代碼文檔意義不大。
加密要素
原文 + 密鑰 + 字表 = 密文字表:值的集合,用於枚舉需要加密的字元。變數:字、字數、字序。
算法約定
(以最簡單為原則)密鑰為值數組,數組單元稱為密鑰字,單元值稱為鑰值。
原文中的處於字表內的字稱為待密字,該字在字表中的序號稱為字值。
逐字地,用密鑰鑰值對待密字值加值變換,取模值為替換字在字表中的位置,替換字即是密字。
密鑰值串循環使用(連續,無跳躍),直至待密字處理完畢。
補充說明
待密字值其實也可以直接採用字元本身的值,同時約定一個固定的字表,如中文GB2312的一級簡碼區漢字,這樣會使得計算更簡單。但如此字值就與編碼有關,同時字值也必須是連續的。為通用性,此設計字表為任意的字集合,字值取它在字表中的序號。字表方案
整集即原始文本包含的所有字元。依不同的文檔而有區別,但一般地,英文文本應該肯定包含【a-zA-Z】52個字母。
特集
任意指定的字集。可能僅包含一些用戶覺得必要的字的一個小的集合。或者,隨機的取整集的一部分。(推薦)
標點集
文章中,常用標點和空格(西方語言)起著斷句和分詞的作用,這明確地表達了文本的結構信息,明顯地,密文應該隱藏這一信息。所以作為推薦,這是一個應該必須包含的集合:
半角空格、半全形逗號【,,】、句號【.。】,計5個字元。
可選的,還可以包含:
冒號(::)、引號("“”)、分號(;;)、頓號(、)、書名號(《》)等等。
另外,根據文本的特點或需要,還應該包含如下有明顯前後關聯意義的符號:
-> 標示前後可能是數字的百分號(% %)、運算符(+ - * /)、貨幣符號;
-> 在現代信息世界裡傳達URI信息的正斜槓(/)、郵件地址符(@);
-> 代碼世界中常用的逃逸字標識符反斜槓(\)、xml實體標識符(&)等等。
全集
包括文檔所屬語言的全部有效字元,不推薦。它除性能不佳外,加密效果(迷惑性)也不好。
子集
相對於規範的編碼系統命名,如中文的一級簡碼區漢字。
補充說明
由於算法極為簡單,如果字表公開,我們可以直接從原文和密文得出密鑰。而在某些情況下,字表是應該公開和通用的。所以,我們不應該去加密已經被知道原文的信息,因為這樣就等於告知了我們用於變形的密鑰(呵呵,當然,既然原文已經被知曉,那也就沒有去加密的必要了)。加密的原始信息應該是破解者未知的,或是可變的。如銀行帳號,它可能由可變的數字和固定的前綴字元組成,而前綴字元肯定廣為人知,如果對這固定的前綴字元也加密,同時用於該算法的字表為公用,當破解者懷疑你的密文是銀行帳號時,他就可以輕易地解出用於這幾個固定字元的密鑰。
套用提示
1、不推薦字表中包含換行符。換行符普遍存在於一般文本中,它讓文本看起來清晰而有條理,但由於字元變換的隨機性,所以會有大量的換行符被替換成非換行符,使得變形後的密文行數大量減少。這樣既使得文本雜亂,同時也降低了密文的迷惑性。
如果換行符不在替換的候選字元中(字表),我們甚至可以編輯密文——如刪掉多餘的空行而不會影響後來的解密過程。(當然,可以刪掉所有不在字表中的字元而對解密無影響,但要記住眾多不在字表中的字元應該是困難的,而且也好像無此必要?)
2、加密後的檔案大小可能會有些變化(雖然字元數沒變),它取決於文本的編碼環境和替換字有哪些。
在多位元組編碼環境中(如MBS或UTF-8),如果我們在一個字表中同時包含單位元組字元和多位元組字元,則對於單位元組字元較多的原始文本,變形後的密文檔案會增大。而對於多位元組字元占絕大部分的原始文本,則很可能密文檔案會稍小一些(不會小太多,因為相對於單位元組字元,多位元組字元數量要龐大得多)。
所以,如果很在意檔案的大小,可以另外定義一個只包含單位元組字元的字表,而多位元組字元定義在另一個字表中,兩者不同字。然後對原始文本參照兩者各處理一次即可。這樣,檔案大小基本上就不會有多少變化了。