您好,欢迎访问一九零五行业门户网

javascript实现playfair和hill密码算法_基础知识

时至期末,补习信息安全概论作业。恰巧遇古典密码学算法中的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
i
n
u
a
b
j
p
v
y
e
k
q
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%26)
        }
    }
}
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])%26;
            }
        }
                //获取字符在字母表中对应索引
        for(var i =0;i            res += chars[sumarr3[i]];
        }
    }
    return res;
};
实现效果如图:
以上算法存在不足:
         1,面向过程设计,耦合度高
         2,过多嵌套循环,算法效率有待优化
         3,对于可能出现的情况考虑不周到,例如没有对用户输入非字母字符时进行处理。
总结:
学了一段时间的信息安全概论这门课,只能对信息安全了解皮毛。信息安全是一门很有趣的科目,平时遇到一些问题尽可能多思考,多动手,多运用。同时也要加强数学基础积累,巩固js基础,拓宽知识面。这条路任重道远。
其它类似信息

推荐信息