最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

javascript實(shí)現(xiàn)playfair和hill密碼算法

 更新時(shí)間:2014年12月07日 14:56:35   投稿:hebedich  
這篇文章主要介紹了javascript實(shí)現(xiàn)playfair和hill密碼算法,需要的朋友可以參考下

時(shí)至期末,補(bǔ)習(xí)信息安全概論作業(yè)。恰巧遇古典密碼學(xué)算法中的playfair算法和hill算法,用javascript語(yǔ)言實(shí)現(xiàn)起來(lái)是在有趣,邊查百度邊編碼,順便好好補(bǔ)習(xí)一下javascript基礎(chǔ)。

playfair

Playfair密碼(英文:Playfair cipher 或 Playfair square)是一種替換密碼。依據(jù)一個(gè)5*5的正方形組成的密碼表來(lái)編寫,表中排列有25個(gè)字母。對(duì)于英語(yǔ)中的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

復(fù)制代碼 代碼如下:

/*
*    功能:編制密碼表
*
*    參數(shù):密鑰(經(jīng)過(guò)去除空格和大寫處理)
*
*    返回:密碼表
*/
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ù)制代碼 代碼如下:

/*
*    功能:去除字符串中重復(fù)字母
*
*    參數(shù):需要進(jìn)行處理的字符串
*
*    返回:處理過(guò)的字符串
*/
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的正方形組成的密碼表來(lái)編寫,表中排列有25個(gè)字母。對(duì)于英語(yǔ)中的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ī)生成密匙

復(fù)制代碼 代碼如下:

/*
*    功能:隨機(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)行處理:

復(fù)制代碼 代碼如下:

/*
*    功能: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,面向過(guò)程設(shè)計(jì),耦合度高

         2,過(guò)多嵌套循環(huán),算法效率有待優(yōu)化

         3,對(duì)于可能出現(xiàn)的情況考慮不周到,例如沒(méi)有對(duì)用戶輸入非字母字符時(shí)進(jìn)行處理。

總結(jié):

學(xué)了一段時(shí)間的信息安全概論這門課,只能對(duì)信息安全了解皮毛。信息安全是一門很有趣的科目,平時(shí)遇到一些問(wèn)題盡可能多思考,多動(dòng)手,多運(yùn)用。同時(shí)也要加強(qiáng)數(shù)學(xué)基礎(chǔ)積累,鞏固js基礎(chǔ),拓寬知識(shí)面。這條路任重道遠(yuǎn)。

相關(guān)文章

  • 詳細(xì)解讀JavaScript編程中的Promise使用

    詳細(xì)解讀JavaScript編程中的Promise使用

    這篇文章主要介紹了詳細(xì)解讀JavaScript編程中的Promise使用,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-07-07
  • JavaScript數(shù)值類型知識(shí)匯總

    JavaScript數(shù)值類型知識(shí)匯總

    這篇文章主要給大家介紹了關(guān)于JavaScript數(shù)值類型知識(shí)匯總的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • 在HTML中插入JavaScript代碼的示例

    在HTML中插入JavaScript代碼的示例

    這篇文章主要介紹了在HTML中插入JavaScript代碼的示例,嵌套在HTML代碼中是JavaScript的基本功能,需要的朋友可以參考下
    2015-06-06
  • JavaScript 瀏覽器對(duì)象模型BOM使用介紹

    JavaScript 瀏覽器對(duì)象模型BOM使用介紹

    這篇文章主要介紹了JavaScript 瀏覽器對(duì)象模型BOM使用介紹,需要的朋友可以參考下
    2015-04-04
  • javascript對(duì)象之內(nèi)置對(duì)象Math使用方法

    javascript對(duì)象之內(nèi)置對(duì)象Math使用方法

    Math對(duì)象的一些方法能實(shí)現(xiàn)我們課本上的某些數(shù)學(xué)計(jì)算,比較常用的方法有如下幾個(gè)
    2010-04-04
  • js array數(shù)組對(duì)象操作方法匯總

    js array數(shù)組對(duì)象操作方法匯總

    這篇文章主要介紹了js array數(shù)組對(duì)象操作方法匯總,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java Mybatis框架入門基礎(chǔ)教程

    Java Mybatis框架入門基礎(chǔ)教程

    MyBatis是一款一流的支持自定義SQL、存儲(chǔ)過(guò)程和高級(jí)映射的持久化框架。MyBatis幾乎消除了所有的JDBC代碼,也基本不需要手工去 設(shè)置參數(shù)和獲取檢索結(jié)果,對(duì)MyBatis感興趣的小伙伴們可以參考一下
    2015-09-09
  • easyui validatebox驗(yàn)證

    easyui validatebox驗(yàn)證

    這篇文章主要介紹了easyui validatebox驗(yàn)證,需要的朋友可以參考下
    2016-04-04
  • js學(xué)習(xí)筆記之事件處理模型

    js學(xué)習(xí)筆記之事件處理模型

    本篇文章主要介紹了js學(xué)習(xí)筆記之事件處理模型,對(duì)初學(xué)這具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2016-10-10
  • JavaScript中原型和原型鏈詳解

    JavaScript中原型和原型鏈詳解

    這篇文章主要介紹了JavaScript中原型和原型鏈詳解,本文講解了私有變量和函數(shù)、靜態(tài)變量和函數(shù)、實(shí)例變量和函數(shù)、原型和原型鏈的基本概念,需要的朋友可以參考下
    2015-02-02

最新評(píng)論

拉萨市| 布拖县| 广昌县| 宣武区| 丘北县| 林甸县| 聊城市| 三都| 个旧市| 宜君县| 华蓥市| 南丹县| 科尔| 修水县| 淳化县| 甘肃省| 浦北县| 班玛县| 长沙县| 兴海县| 长春市| 长沙县| 平谷区| 蒲城县| 祁阳县| 汉源县| 伊通| 姜堰市| 西充县| 周至县| 印江| 阜宁县| 上思县| 南华县| 西畴县| 弋阳县| 乌鲁木齐市| 长宁区| 胶州市| 顺昌县| 福鼎市|