UNPKG

vignere-babbage-cipher

Version:

Encrypt/decrypt by using the Vignere–Babbage cipher

117 lines (102 loc) 4.13 kB
"use strict"; // 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;