vignere-babbage-cipher
Version:
Encrypt/decrypt by using the Vignere–Babbage cipher
117 lines (102 loc) • 4.13 kB
JavaScript
;
// Key: C O D E H E L L O W (x)
// Encrypted: J S O P V A Z C Z Z (from the table)
// Plain text: H E L L O W O R L D (Y)
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
var VIGNERE_SQUARE = {
A: "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
B: "BCDEFGHIJKLMNOPQRSTUVWXYZA",
C: "CDEFGHIJKLMNOPQRSTUVWXYZAB",
D: "DEFGHIJKLMNOPQRSTUVWXYZABC",
E: "EFGHIJKLMNOPQRSTUVWXYZABCD",
F: "FGHIJKLMNOPQRSTUVWXYZABCDE",
G: "GHIJKLMNOPQRSTUVWXYZABCDEF",
H: "HIJKLMNOPQRSTUVWXYZABCDEFG",
I: "IJKLMNOPQRSTUVWXYZABCDEFGH",
J: "JKLMNOPQRSTUVWXYZABCDEFGHI",
K: "KLMNOPQRSTUVWXYZABCDEFGHIJ",
L: "LMNOPQRSTUVWXYZABCDEFGHIJK",
M: "MNOPQRSTUVWXYZABCDEFGHIJKL",
N: "NOPQRSTUVWXYZABCDEFGHIJKLM",
O: "OPQRSTUVWXYZABCDEFGHIJKLMN",
P: "PQRSTUVWXYZABCDEFGHIJKLMNO",
Q: "QRSTUVWXYZABCDEFGHIJKLMNOP",
R: "RSTUVWXYZABCDEFGHIJKLMNOPQ",
S: "STUVWXYZABCDEFGHIJKLMNOPQR",
T: "TUVWXYZABCDEFGHIJKLMNOPQRS",
U: "UVWXYZABCDEFGHIJKLMNOPQRST",
V: "VWXYZABCDEFGHIJKLMNOPQRSTU",
W: "WXYZABCDEFGHIJKLMNOPQRSTUV",
X: "XYZABCDEFGHIJKLMNOPQRSTUVW",
Y: "YZABCDEFGHIJKLMNOPQRSTUVWX",
Z: "ZABCDEFGHIJKLMNOPQRSTUVWXY"
};
var VignereBabbageCipher = function () {
function VignereBabbageCipher() {
_classCallCheck(this, VignereBabbageCipher);
}
_createClass(VignereBabbageCipher, null, [{
key: "encrypt",
/**
* encrypt
* Encrypt the plain text.
*
* @name encrypt
* @function
* @static
* @param {String} input The plain text to encrypt.
* @param {String} key The key.
* @returns {String} The encrypted version.
*/
value: function encrypt(input, key) {
var decrypted = "";
if (input.length > key.length) {
key += input.slice(0, input.length - key.length);
}
input = input.toUpperCase();
key = key.toUpperCase();
key = key.replace(new RegExp("[^" + VIGNERE_SQUARE.A + "]", "g"), "");
var index = -1;
return input.split("").map(function (letter) {
var charset = VIGNERE_SQUARE[letter];
if (charset) {
return charset[VIGNERE_SQUARE.A.indexOf(key[++index])];
} else {
return letter;
}
}).join("");
}
/**
* decrypt
* Decrypt the input.
*
* @name decrypt
* @function
* @static
* @param {String} input Decrypt the encrypted text.
* @param {String} key The key.
* @returns {String} The result in plain text.
*/
}, {
key: "decrypt",
value: function decrypt(input, key) {
var decrypted = "";
input = input.toUpperCase();
key = key.toUpperCase();
var index = 0;
return input.split("").map(function (letter) {
var charset = VIGNERE_SQUARE[key[index]];
if (!VIGNERE_SQUARE[letter]) {
return letter;
}
var cLetter = VIGNERE_SQUARE.A[charset.indexOf(letter)];
key += cLetter;
++index;
return cLetter;
}).join("");
}
}]);
return VignereBabbageCipher;
}();
module.exports = VignereBabbageCipher;