■维吉尼亚加密(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()">
<input type="button" value="解密" onClick="do_decrypt()">
</form>
.