時至期末,補習資訊安全概論作業。恰巧遇古典密碼學演算法中的playfair演算法和hill演算法,用javascript語言實作起來是在有趣,邊查百度邊編碼,順便好好補習javascript基礎。
playfair
Playfair密碼(英文:Playfair cipher 或 Playfair square)是一種替換密碼。依據一個5*5的正方形組成的密碼表來寫,表中排列有25個字母。對於英文中的26個字母,去掉最常用的Z,構成密碼表。
實現思路:
1,編製密碼表
金鑰是一個單字或詞組,密碼表則是根據使用者所給的金鑰整理而出。若有重複字母,可將後面重複的字母去掉。
如密鑰crazy dog,可編製成
C
|
O
|
H
|
M
|
T
|
R
|
G
|
我
|
N
|
你
|
一
|
B
|
J
|
P
|
V
|
Y
|
E
|
K
|
問
|
W
|
D
|
F
|
L
|
S
|
X
|
考慮將keychars插入密碼表時需要移除重複字元和Z,設計演算法如下:
2,整理明文
將明文每兩個字母組成一對。如果成對後有兩個相同字母緊鄰或最後一個字母是單一的,就插入一個字母X。初期編碼時考慮不周到,強硬地拒絕輸入字母個數為單數,使用者體驗不佳。
var k = document.getElementById("keychars").value.toUpperCase().replace(/s/ig,'');
對明文去除空格和轉換為大寫處理。
3,寫密文
明文加密規則(出自百度):
1 )若p1 p2在同一行,對應密文c1 c2分別是緊靠p1 p2 右端的字母。其中第一列被看做是最後一列的右邊。如,按照前表,ct對應oc
2 )若p1 p2在同一列,對應密文c1 c2分別是緊靠p1 p2 下方的字母。其中第一行被看做是最後一行的下方。
3 )若p1 p2不在同一行,不在同一列,則c1 c2是由p1 p2確定的矩形的其他兩角的字母(至於橫向替換還是縱向替換要事先約好,或自行嘗試)。如按照前表,wh對應tk或kt。
如,依上表,明文where there is life,there is hope.
可先整理為wh er et he re is li fe th er ei sh op ex
則密文為:kt yg wo ok gy nl hj of cm yg kg lm mb wf
將密文變成大寫,然後幾個字母一組排列。
如5個一組就是KTYGW OOKGY NLHJO FCMYG KGLMM BWF
4,解密
將密鑰填入5*5的矩陣中(去出重複字母和字母z),矩陣中其它未用到的字母按順序填在矩陣剩餘位置中,根據替換矩陣由密文得到明文。反其道而行。
實現效果如圖:
hill
希爾密碼(Hill Password)是運用基本矩陣論原理的替換密碼。依據一個5*5的正方形組成的密碼表來寫,表中排列有25個字母。對於英文中的26個字母,去掉最常用的Z,構成密碼表。
實現思路:
1,寫字母表
var chars = ['A','B','C','D','E','F','G','H','I','J','K','L ','M','N','O','P','Q','R','S','T','U','V','W','X', 'Y','Z'];
2,隨機產生密匙
實現效果如圖:
以上演算法存在不足:
1,以製程設計,耦合度高
2,且過度巢狀循環,且演算法效率有待最佳化
3,並在可能出現的情況考慮不周到,例如沒有對使用者輸入非字母字元時進行處理。
總結:
學了一段時間的資訊安全概論這門課,只能對資訊安全了解皮毛。資訊安全是一門很有趣的科目,平常遇到一些問題盡可能多思考,多動手,多運用。同時也要加強數學基礎積累,鞏固js基礎,拓寬知識面。這條路任重而道遠。