首頁 > web前端 > js教程 > 主體

javascript實作playfair和hill密碼演算法_基礎知識

WBOY
發布: 2016-05-16 16:28:36
原創
1601 人瀏覽過

時至期末,補習資訊安全概論作業。恰巧遇古典密碼學演算法中的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

複製程式碼 程式碼如下:

/*
*    功能:編製密碼表
*
*    參數:金鑰(經過移除空格和大寫處理)
*
*    回:密碼表
*/
function createKey(keychars){
       //字母順序陣列
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         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         for(var j = 0; j             key[j][i] = allChars[i*5 j];
        }
    }
}   

考慮將keychars插入密碼表時需要移除重複字元和Z,設計演算法如下:

複製程式碼 程式碼如下:

/*
*    功能:去除字串中重複字母
*
*    參數:需要處理的字串
*
*    傳回:處理過的字串
*/
function removeDuplicate(str){
    var result = [],tempStr = "";
    var arr = str.split('');//把字串分割成陣列
        //arr.sort();//排序
        for(var i = 0; i             var repeatBack = true;//設計變數是為確保字串前部分不存在相同字符,因為以下演算法只能確保連在一起相同的字元
            for(var j = 0;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("");//將陣列轉換為字串
}

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,隨機產生密匙

複製程式碼 程式碼如下:

/*
*    功能:隨機產生密鑰
*
*    回:密匙矩陣
*/
function randomCreateKey(){
    //隨機產生0到26的數字
    for(var i = 0;i         for(var j = 0;j             key[i][j] = Math.round(Math.random()*100&)
        }
    }
}

3,關鍵性代碼,根據自動產生的密匙,明文處理:

複製程式碼 程式碼如下:

/*
*    功能:hill演算法
*
*    參數:長度是3的倍數的大寫數組
*   
*    回傳:加密後的字串
*/
function hill(p){
    //大寫字母密文
    var res = "";
        //制定總共需要對字串經行遍歷的次數
    var round = Math.round(p.length/3);
    //處理
    for(var b = 0;b         //明文3
            var temp3 ="";
        var tempArr3 = [];
        var sumArr3 = [];
        for(var i = 0;i             temp3 = p.shift();
            for(var j = 0;j                 if(temp3[i] == chars[j])
                    tempArr3[i] = j;
            }
        }
                //計算
        for(var i =0;i             for(var j = 0;j                 sumArr3[i] = (tempArr3[j]*key[i][j])&;
            }
        }
                //取得字元在字母表對應索引
        for(var i =0;i             res = chars[sumArr3[i]];
        }
    }
    return res;
};

 實現效果如圖:

以上演算法存在不足:

         1,以製程設計,耦合度高

         2,且過度巢狀循環,且演算法效率有待最佳化

         3,並在可能出現的情況考慮不周到,例如沒有對使用者輸入非字母字元時進行處理。

總結:

學了一段時間的資訊安全概論這門課,只能對資訊安全了解皮毛。資訊安全是一門很有趣的科目,平常遇到一些問題盡可能多思考,多動手,多運用。同時也要加強數學基礎積累,鞏固js基礎,拓寬知識面。這條路任重而道遠。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!