【加密解密】维吉尼亚加密(Javascript实现)

■维吉尼亚加密(Vigenere  cipher )

维吉尼亚加密是使用一系列凯撒加密组成密码字母表的加密算法,属于多表密码的一种简单形式。

维吉尼亚加密以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。

维吉尼亚密码是由一些偏移量不同的恺撒密码组成。

为了生成密码,需要使用表格法。这一表格包括了26行字母表,每一行都由前一行向左偏移一位得到。具体使用哪一行字母表进行编译是基于密钥进行的,在过程中会不断地变换。

明文:ATTACKATDAWN

选择某一关键词并重复而得到密钥,如关键词为LEMON时,密钥为:

密钥:LEMONLEMONLE

对于明文的第一个字母A,对应密钥的第一个字母L,于是使用表格中L行字母表进行加密,得到密文第一个字母L。类似地,明文第二个字母为T,在表格中使用对应的E行进行加密,得到密文第二个字母X。以此类推,可以得到:

密文:LXFOPVEFRNHR

维吉尼亚加密.
<script language="JavaScript">
// encrypt using Vingere
function do_encrypt() {
    var key   = document.cipher.key.value;
    var plain = document.cipher.plain.value;
    var ctext = "";

    // do the encoding
    var kpos = 0;
    for( var i = 0; i < plain.length; i ++ ) {
        var kcode = key.charCodeAt( kpos % key.length );
        var pcode = plain.charCodeAt( i );
        var ccode = pcode;
        if ( pcode >= 65 && pcode <= 90 ) {
            if (kcode >= 65 && kcode <= 90 ) {
                ccode = ( ( kcode - 65 ) + ( pcode - 65 ) ) % 26 + 65;
            }
            if (kcode >= 97 && kcode <= 122 ) {
                ccode = ( ( kcode - 97 ) + ( pcode - 65 ) ) % 26 + 65;
            }
            kpos ++;
        }
        if ( pcode >= 97 && pcode <= 122 ) {
            if (kcode >= 65 && kcode <= 90 ) {
                ccode = ( ( kcode - 65 ) + ( pcode - 97 ) ) % 26 + 97;
            }
            if (kcode >= 97 && kcode <= 122 ) {
                ccode = ( ( kcode - 97 ) + ( pcode - 97 ) ) % 26 + 97;
            }
            kpos ++;
        }
        // console.log(pcode + "," + ccode);
        ctext += String.fromCharCode(ccode);
    }

    document.cipher.enc.value = ctext;
}

function do_decrypt() {
    var key   = document.cipher.key.value;
    var ctext = document.cipher.enc.value;
    var plain = "";

    // do the encoding
    var kpos = 0;
    for( var i = 0; i < ctext.length; i ++ ) {
        var kcode = key.charCodeAt( kpos % key.length );
        var ccode = ctext.charCodeAt( i );
        var pcode = ccode;
        if ( ccode >= 65 && ccode <= 90 ) {
            if (kcode >= 65 && kcode <= 90) {
                pcode = ( ( ccode - 65 ) - ( kcode - 65 ) + 26 ) % 26 + 65;
            }
            if (kcode >= 97 && kcode <= 122) {
                pcode = ( ( ccode - 65 ) - ( kcode - 97 ) + 26 ) % 26 + 65;
            }
            kpos ++;
        }
        if ( ccode >= 97 && ccode <= 122 ) {
            if (kcode >= 65 && kcode <= 90) {
                pcode = ( ( ccode - 97 ) - ( kcode - 65 ) + 26 ) % 26 + 97;
            }
            if (kcode >= 97 && kcode <= 122) {
                pcode = ( ( ccode - 97 ) - ( kcode - 97 ) + 26 ) % 26 + 97;
            }
            kpos ++;
        }
        // console.log(ccode + "," + pcode);
        plain += String.fromCharCode(pcode);
    }

    document.cipher.plain.value = plain;
}
</script>
<form name="cipher">
<table>
<tr><td>密钥:</td><td><input type="text" name="key" value="sampleKey"></td></tr>
<tr><td>明文:</td><td><input type="text" name="plain" size=50 value="This is a test."></td></tr>
<tr><td>密文:</td><td><input type="text" name="enc" size=50></td></tr>
</table>
<input type="button" value="加密" onClick="do_encrypt()">&nbsp;
<input type="button" value="解密" onClick="do_decrypt()">
</form>

.

转载于:https://my.oschina.net/dubenju/blog/833670

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值