最簡人機交互-加解密

瀏覽器 F12 控制檯(Console),觸手可及的人機交互,JavaScript 命令行,輕量級,隨時輕鬆編程實踐。

1. 關於加密

上學時遞小紙條,尤其是需要中間人傳遞時,是不是使用過一套約定的符號代替普通的文字?特別有必要!

廣義來講,保護信息的各種方式都屬於加密範疇,而保護的形式、角度、等級和目標是多種多樣的。

2. 幾種情形下的策略

(1)內容是否被修改

電視劇裏,經常有材料被情敵偷偷修改然後蒙冤的場景。何解?
策略:讓內容中每一個字節都參與一項運算得出一個結果記錄下來,如果計算結果變了,說明內容被修改過。

這裏運算得出的結果叫做摘要,這個算法叫消息摘要算法,也叫單向散列函數。算法的科學性很重要,常見的算法有:MD5、SHA1、SHA256、SHA512、HmacMD5、HmacSHA1、HmacSHA256 等。

(2)不要給別人看到

這個,只能說難免會被別人看到。
策略:使用密鑰變換內容,讓別人看到也不知道爲何物,通過密鑰纔可還原內容。

這種通過相同的密鑰來加密和解密的算法,叫對稱加密算法。常見算法DES、3DES(TripleDES)和AES(Advanced Encryption Standard)等。AES 根據密鑰長度不同又分爲AES-128 AES-192 AES-256 對應16 24 32 字節。

這些算法,通常是按塊來進行加密的,如 16 個字節爲一塊。當最後一塊不夠 16 個字節時,通常是採用補齊的策略,補齊的方式也有不同講究。
策略一,數據長度不對齊時使用0填充,否則不填充,但補的0解密後無法區分是補的還是原本就有的,只適合以\0結尾的字符串加密,此謂之 ZeroPadding。
策略二,補充的字節值設定爲補充的數量,如要補充5個字節,則這5個字節的值都爲 5,這樣根據最後一個字節可得到填充數據的長度,在解密後可以準確刪除填充的數據。但如果剛好整塊無需補充,爲了仍然滿足最後一個字節表示填充的數據長度,填充一整塊,值爲塊長度。此種方式有 PKCS7Padding,它假設數據長度需要填充n(n>0)個字節纔對齊,那麼填充n個字節,每個字節都是n;如果數據本身就已經對齊了,則填充一塊長度爲塊大小的數據,每個字節都是塊大小。PKCS5Padding,PKCS7Padding的子集,塊大小固定爲8字節。

分塊加密時,每塊採用完成相同的加密過程,則可以並行加密再拼接,但當內容中有多塊相同的內容時加密結果會一樣,而這種重複會爲破解提供線索,於是多種加密模式被提出。以下是兩種最常見的模式。

Electronic Code Book(ECB)
電子密碼本模式
最基本的加密模式,也就是通常理解的加密,相同的明文將永遠加密成相同的密文,無初始向量,容易受到密碼本重放攻擊,一般情況下很少用。

Cipher Block Chaining(CBC)
密碼分組鏈接模式
明文被加密前要與前面的密文進行異或運算後再加密,因此只要選擇不同的初始向量,相同的密文加密後會形成不同的密文,這是目前應用最廣泛的模式。CBC加密後的密文是上下文相關的,但明文的錯誤不會傳遞到後續分組,但如果一個分組丟失,後面的分組將全部作廢(同步錯誤)。

(3)是否真的來自對的人

對稱加密中,接收方需要知道密鑰,這個密鑰本身的保密就成爲了問題。密鑰泄漏,意味着正確解密的消息也變得不可靠,也許是僞造的。

策略:公開密鑰,即發給我的消息,使用公開密鑰加密,我收到之後只可用我的私有密鑰解密。

此謂之非對稱加密算法,一種強大的密鑰保密方法。這離不開理論上的研究成果。

W.Diffie和M.Hellman 1976年在IEEE Trans.on Information刊物上發表了“ New Direction in Cryptography”文章,提出了“非對稱密碼體制即公開密鑰密碼體制”的概念,開創了密碼學研究的新方向

非對稱加密算法需要兩個密鑰:公開密鑰(publickey:簡稱公鑰)和私有密鑰(privatekey:簡稱私鑰)。公鑰與私鑰是一對,如果用公鑰對數據進行加密,只有用對應的私鑰才能解密。

爲了驗證是不是對的人,可以要求發送放對內容提取摘要,並使用其私鑰加密,將結果附在後邊作爲簽名一併發送。這樣,就可以使用發送放的公鑰來解密這個簽名並驗證其一致性,如果一致說明是對的人發過來的。此過程謂之簽名驗籤。

使用最廣泛的是RSA算法。

3. 常見算法實操

很多常見的加密算法在 CryptoJS 中有實現,首先,在控制檯引入擴展腳本。

var s = document.createElement("script");
s.src  = "https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js";
document.body.appendChild(s);

MD5

CryptoJS.MD5("hello").toString();
// 得到 5d41402abc4b2a76b9719d911017c592
CryptoJS.MD5("he11o").toString();
// 得到 8f3946d5aaad6af7ebd41b6a6e6b1756

AES128

var message = "我想對你說...";
var key = "%$123456";
var cipher = CryptoJS.AES.encrypt(message, key);
console.log(cipher.toString());

加密結果 U2FsdGVkX1/Ry7m4YU7aTXizLMAGhn2EwZf555rz8neh6FP6/4p9CUaZpnBxvOKT
解密過程

var cipher = "U2FsdGVkX1/Ry7m4YU7aTXizLMAGhn2EwZf555rz8neh6FP6/4p9CUaZpnBxvOKT";
var key = "%$123456";
var plain = CryptoJS.AES.decrypt(cipher, key);
var oritext = CryptoJS.enc.Utf8.stringify(plain);
console.log(oritext);

加密的內容爲16進制數據時,可以利用以下方式將16進制字符串轉換成字節數組。

var key = CryptoJS.enc.Hex.parse("000102030405060708090a0b0c0d0e0f");
var mess = CryptoJS.enc.Hex.parse("00000000000000000000000000000000");
var r = CryptoJS.AES.encrypt(mess, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.NoPadding })
r.ciphertext.toString();

計算結果 c6a13b37878f5b826f4f8162a1c8d879

RSA

CryptoJS 當前尚未支持 RSA,可以引入以下 JS 擴展。

var s = document.createElement("script");
s.src  = "https://cdn.bootcdn.net/ajax/libs/jsencrypt/3.2.0/jsencrypt.min.js";
document.body.appendChild(s);

使用公鑰加密

var e = new JSEncrypt();
e.setPublicKey("......");
var cipher = e.encrypt("hello world!");
console.log(cipher);

OVNmfqDMAxHoiMbNHNQ4Olrb0BHGLHEPXM0EAJ/hTwEJsz+igrLIPnrqf1ABmWnoj6cOOcGNroYLa2xZ9/TkaF5UKG+H+RrjpbHHQVe3mWWlDsX9bZ/m8lP3izntwKHdklH+2vfeOlSJ3+PK3O6ILWvaVM4PVCzVo9lPiN7NkIE=


使用私鑰解密

var d = new JSEncrypt();
d.setPrivateKey("......");
var plain = d.decrypt(cipher);
console.log(plain);

反過來使用私鑰加密公鑰解密也是可以的,只是一般的工具方法,只會提供私密生成簽名,公鑰驗證簽名,但這足夠了。
更詳細用法,請參考 https://github.com/travist/jsencrypt/

4. 加密和破解

直接來看看二戰期間的故事,以下內容引用自 https://zhidao.baidu.com/question/13366735.html

二次大戰中,英國傾全國之力,破譯了德國的“謎語機”密碼,爲戰勝納粹德國作出重要貢獻;美國則破譯了日軍密碼,由此發動空襲,擊毀日本大將山本五十六的座機。丘吉爾說,密碼員就是“下了金蛋卻從不叫喚的鵝”。
  用納瓦霍語編制軍事密碼,是一個叫菲利普·約翰遜的白人出的主意。約翰遜的父親是傳教士,曾到過納瓦霍部落,能說一口流利的納瓦霍語,而在當時,納瓦霍語對部落外的人來說,無異於“鳥語”。極具軍事頭腦的約翰遜認爲,如果用納瓦霍語編制軍事密碼,將非常可靠而且無法破譯。因爲這種語言口口相傳,沒有文字,其語法、聲調、音節都非常複雜,沒有經過專門的長期訓練,根本不可能弄懂它的意思。另外,根據當時的資料記載,通曉這一語言的非納瓦霍族人全球不過30人,其中沒有一個是日本人。
  1942年初,約翰遜向美國太平洋艦隊上將克萊登·沃格爾提出了這個建議。約翰遜說,根據他的實驗,用納瓦霍語編制的密碼可以在20秒內將三行英文信息傳遞出去,而同樣的信息用機器密碼卻需要30分鐘。
  沃格爾接受了約翰遜的建議。1942年5月,第一批29名納瓦霍人被徵召入伍,並被安排在加利福尼亞一處海濱編制密碼。他們根據納瓦霍語共創建了有500個常用軍事術語的詞彙表。由於納瓦霍語沒有描述現代軍事設備的詞語,因此他們經常使用比喻說法和擬聲詞。
  在太平洋戰爭期間,美國海軍陸戰隊共徵召了420名納瓦霍族人充當密碼通訊員。這些納瓦霍族人蔘加了美軍在太平洋地區發動的每一場戰役。他們用密碼下達戰鬥命令,通報戰情,緊急時還參加戰鬥。他們的英勇獻身,爲最終打敗日本軍國主義者起到重要作用。
  攻佔硫磺島是美軍在太平洋戰爭中打的一場經典戰役,美軍把旗幟插上硫磺島的照片,成爲美國在二戰中浴血奮戰的象徵。硫磺島戰役結束後,負責聯絡的霍華德·康納上校曾感慨地說:“如果不是因爲納瓦霍人,美國海軍將永遠攻佔不了硫磺島。”當時,康納手下共有6名納瓦霍密碼員,在戰鬥開始的前兩天,他們通宵工作,沒有一刻休息。整個戰鬥中,他們共接發了800多條消息,沒有出現任何差錯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章