javascript實(shí)現(xiàn)playfair和hill密碼算法
時(shí)至期末,補(bǔ)習(xí)信息安全概論作業(yè)。恰巧遇古典密碼學(xué)算法中的playfair算法和hill算法,用javascript語言實(shí)現(xiàn)起來是在有趣,邊查百度邊編碼,順便好好補(bǔ)習(xí)一下javascript基礎(chǔ)。
playfair
Playfair密碼(英文:Playfair cipher 或 Playfair square)是一種替換密碼。依據(jù)一個(gè)5*5的正方形組成的密碼表來編寫,表中排列有25個(gè)字母。對(duì)于英語中的26個(gè)字母,去掉最常用的Z,構(gòu)成密碼表。
實(shí)現(xiàn)思路:
1,編制密碼表
密鑰是一個(gè)單詞或詞組,密碼表則根據(jù)用戶所給出的密鑰整理而出。若有重復(fù)字母,可將后面重復(fù)的字母去掉?!?/p>
如密鑰crazy dog,可編制成
C
|
O
|
H
|
M
|
T
|
R
|
G
|
I
|
N
|
U
|
A
|
B
|
J
|
P
|
V
|
Y
|
E
|
K
|
Q
|
W
|
D
|
F
|
L
|
S
|
X
|
/*
* 功能:編制密碼表
*
* 參數(shù):密鑰(經(jīng)過去除空格和大寫處理)
*
* 返回:密碼表
*/
function createKey(keychars){
//字母順序數(shù)組
var allChars = ['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'];
//變量keychars獲取字母在字母順序表中位置,刪除該字母
for(var i = 0 ;i<keychars.length;i++){
var index = allChars.indexOf(keychars[i]);
if (index > -1) {
allChars.splice(index, 1);
}
}
//將keychar中的字母插入到字母表中
for(var i = keychars.length-1;i>=0;i--){
allChars.unshift(keychars[i]);
}
//從第一列將keychars插入至密碼表
for(var i = 0 ; i<5 ; i++){
for(var j = 0; j<5 ;j++){
key[j][i] = allChars[i*5+j];
}
}
}
考慮將keychars插入到密碼表時(shí)需要去除重復(fù)字符和Z,設(shè)計(jì)算法如下:
/*
* 功能:去除字符串中重復(fù)字母
*
* 參數(shù):需要進(jìn)行處理的字符串
*
* 返回:處理過的字符串
*/
function removeDuplicate(str){
var result = [],tempStr = "";
var arr = str.split('');//把字符串分割成數(shù)組
//arr.sort();//排序
for(var i = 0; i < arr.length; i++){
var repeatBack = true;//設(shè)計(jì)變量是為確保字符串前部分不存在相同字符,因?yàn)橐韵滤惴ㄖ荒艽_保連在一起相同的字符
for(var j = 0;j<result.length ;j++){
if(arr[i] == result[j])
repeatBack = false;
}
if(arr[i] !== tempStr && repeatBack){
result.push(arr[i]);
tempStr = arr[i];
}else{
continue;
}
}
return result.join("");//將數(shù)組轉(zhuǎn)換為字符串
}
2,整理明文
將明文每?jī)蓚€(gè)字母組成一對(duì)。如果成對(duì)后有兩個(gè)相同字母緊挨或最后一個(gè)字母是單個(gè)的,就插入一個(gè)字母X。初期編碼時(shí)考慮不周到,強(qiáng)硬地拒絕輸入字母?jìng)€(gè)數(shù)為單數(shù),用戶體驗(yàn)不佳。
var k = document.getElementById("keychars").value.toUpperCase().replace(/\s/ig,'');
對(duì)明文去除空格和轉(zhuǎn)換為大寫處理。
3,編寫密文
明文加密規(guī)則(出自百度):
1 )若p1 p2在同一行,對(duì)應(yīng)密文c1 c2分別是緊靠p1 p2 右端的字母。其中第一列被看做是最后一列的右方。如,按照前表,ct對(duì)應(yīng)oc
2 )若p1 p2在同一列,對(duì)應(yīng)密文c1 c2分別是緊靠p1 p2 下方的字母。其中第一行被看做是最后一行的下方。
3 )若p1 p2不在同一行,不在同一列,則c1 c2是由p1 p2確定的矩形的其他兩角的字母(至于橫向替換還是縱向替換要事先約好,或自行嘗試)。如按照前表,wh對(duì)應(yīng)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
將密文變成大寫,然后幾個(gè)字母一組排列。
如5個(gè)一組就是KTYGW OOKGY NLHJO FCMYG KGLMM BWF
4,解密
將密鑰填寫在一個(gè)5*5的矩陣中(去出重復(fù)字母和字母z),矩陣中其它未用到的字母按順序填在矩陣剩余位置中,根據(jù)替換矩陣由密文得到明文。反其道而行。
實(shí)現(xiàn)效果如圖:
hill
希爾密碼(Hill Password)是運(yùn)用基本矩陣論原理的替換密碼。依據(jù)一個(gè)5*5的正方形組成的密碼表來編寫,表中排列有25個(gè)字母。對(duì)于英語中的26個(gè)字母,去掉最常用的Z,構(gòu)成密碼表。
實(shí)現(xiàn)思路:
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,隨機(jī)生成密匙
/*
* 功能:隨機(jī)生成密鑰
*
* 返回:密匙矩陣
*/
function randomCreateKey(){
//隨機(jī)生成0到26的數(shù)字
for(var i = 0;i<3;i++){
for(var j = 0;j<3;j++){
key[i][j] = Math.round(Math.random()*100%26)
}
}
}
3,關(guān)鍵性代碼,根據(jù)自動(dòng)生成的密匙,對(duì)明文進(jìn)行處理:
/*
* 功能:hill算法
*
* 參數(shù):長(zhǎng)度是3的倍數(shù)的大寫數(shù)組
*
* 返回:加密后的字符串
*/
function hill(p){
//大寫字母密文
var res = "";
//制定總共需要對(duì)字符串經(jīng)行遍歷的次數(shù)
var round = Math.round(p.length/3);
//處理
for(var b = 0;b<round;b++){
//明文3
var temp3 ="";
var tempArr3 = [];
var sumArr3 = [];
for(var i = 0;i<3;i++){
temp3 += p.shift();
for(var j = 0;j<chars.length;j++){
if(temp3[i] == chars[j])
tempArr3[i] = j;
}
}
//計(jì)算
for(var i =0;i<3;i++){
for(var j = 0;j<3;j++){
sumArr3[i] = (tempArr3[j]*key[i][j])%26;
}
}
//獲取字符在字母表中對(duì)應(yīng)索引
for(var i =0;i<3;i++){
res += chars[sumArr3[i]];
}
}
return res;
};
實(shí)現(xiàn)效果如圖:
以上算法存在不足:
1,面向過程設(shè)計(jì),耦合度高
2,過多嵌套循環(huán),算法效率有待優(yōu)化
3,對(duì)于可能出現(xiàn)的情況考慮不周到,例如沒有對(duì)用戶輸入非字母字符時(shí)進(jìn)行處理。
總結(jié):
學(xué)了一段時(shí)間的信息安全概論這門課,只能對(duì)信息安全了解皮毛。信息安全是一門很有趣的科目,平時(shí)遇到一些問題盡可能多思考,多動(dòng)手,多運(yùn)用。同時(shí)也要加強(qiáng)數(shù)學(xué)基礎(chǔ)積累,鞏固js基礎(chǔ),拓寬知識(shí)面。這條路任重道遠(yuǎn)。
- Javascript中的常見排序算法
- JavaScript blog式日歷控件新算法
- 一個(gè)簡(jiǎn)單的JavaScript 日期計(jì)算算法
- javascript &&和||運(yùn)算法的另類使用技巧
- javascript算法題 求任意一個(gè)1-9位不重復(fù)的N位數(shù)在該組合中的大小排列序號(hào)
- Javascript和HTML5利用canvas構(gòu)建Web五子棋游戲?qū)崿F(xiàn)算法
- JavaScript生成GUID的多種算法小結(jié)
- javascript圖片相似度算法實(shí)現(xiàn) js實(shí)現(xiàn)直方圖和向量算法
- js交換排序 冒泡排序算法(Javascript版)
- JavaScript實(shí)現(xiàn)twitter puddles算法實(shí)例
相關(guān)文章
IE6瀏覽器下resize事件被執(zhí)行了多次解決方法
在IE瀏覽器下,一次resize事件被執(zhí)行了多次,這是IE6和IE7的一個(gè)比較廣為認(rèn)知的問題,這個(gè)問題在這兩個(gè)版本的瀏覽器中表現(xiàn)有所不同,通常IE6下會(huì)比IE7下更為糟糕,接下來將介紹解決方法,需要的朋友可以參考下2012-12-12javascript函數(shù)作用域?qū)W習(xí)示例(js作用域)
javascript中沒有塊級(jí)作用域,取而代之的javascript使用的是函數(shù)作用域,下面使用示例學(xué)習(xí)一下js作用域的使用方法2014-01-01JavaScript學(xué)習(xí)筆記之Function對(duì)象
這篇文章主要介紹了JavaScript學(xué)習(xí)筆記之Function對(duì)象的相關(guān)資料,需要的朋友可以參考下2015-01-01淺談Javascript常用正則表達(dá)式應(yīng)用
這篇文章主要介紹了Javascript常用正則表達(dá)式應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03appendChild() 或 insertBefore()使用與區(qū)別介紹
appendChild() 方法在節(jié)點(diǎn)的子節(jié)點(diǎn)列表末添加新的子節(jié)點(diǎn)。insertBefore() 方法在節(jié)點(diǎn)的子節(jié)點(diǎn)列表任意位置插入新的節(jié)點(diǎn),下面為大家介紹下具體的使用,感興趣的朋友不要錯(cuò)過2013-10-10