CyberChef/src/core/operations/BaconCipherEncode.mjs

102 lines
2.9 KiB
JavaScript
Raw Normal View History

2019-03-02 17:33:17 +01:00
/**
2019-09-04 18:13:05 +02:00
* @author Karsten Silkenbäumer [github.com/kassi]
* @copyright Karsten Silkenbäumer 2019
* @license Apache-2.0
*/
2019-03-02 17:33:17 +01:00
import Operation from "../Operation";
import {
BACON_ALPHABETS,
2019-03-02 17:33:17 +01:00
BACON_TRANSLATIONS_FOR_ENCODING, BACON_TRANSLATION_AB,
swapZeroAndOne
} from "../lib/Bacon";
/**
2019-09-04 18:13:05 +02:00
* Bacon Cipher Encode operation
*/
2019-03-02 17:33:17 +01:00
class BaconCipherEncode extends Operation {
/**
2019-09-04 18:13:05 +02:00
* BaconCipherEncode constructor
*/
2019-03-02 17:33:17 +01:00
constructor() {
super();
this.name = "Bacon Cipher Encode";
this.module = "Default";
2019-09-04 18:13:05 +02:00
this.description = "Bacon's cipher or the Baconian cipher is a method of steganography devised by Francis Bacon in 1605. A message is concealed in the presentation of text, rather than its content.";
this.infoURL = "https://wikipedia.org/wiki/Bacon%27s_cipher";
2019-03-02 17:33:17 +01:00
this.inputType = "string";
this.outputType = "string";
this.args = [
{
"name": "Alphabet",
"type": "option",
"value": Object.keys(BACON_ALPHABETS)
2019-03-02 17:33:17 +01:00
},
{
"name": "Translation",
"type": "option",
"value": BACON_TRANSLATIONS_FOR_ENCODING
},
{
"name": "Keep extra characters",
"type": "boolean",
"value": false
},
{
"name": "Invert Translation",
"type": "boolean",
"value": false
}
];
}
/**
2019-09-04 18:13:05 +02:00
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
2019-03-02 17:33:17 +01:00
run(input, args) {
const [alphabet, translation, keep, invert] = args;
const alphabetObject = BACON_ALPHABETS[alphabet];
2019-03-02 17:33:17 +01:00
const charCodeA = "A".charCodeAt(0);
const charCodeZ = "Z".charCodeAt(0);
let output = input.replace(/./g, function (c) {
const charCode = c.toUpperCase().charCodeAt(0);
if (charCode >= charCodeA && charCode <= charCodeZ) {
let code = charCode - charCodeA;
if (alphabetObject.codes !== undefined) {
code = alphabetObject.codes[code];
2019-03-02 17:33:17 +01:00
}
const bacon = ("00000" + code.toString(2)).substr(-5, 5);
return bacon;
} else {
return c;
}
});
if (invert) {
output = swapZeroAndOne(output);
}
if (!keep) {
output = output.replace(/[^01]/g, "");
const outputArray = output.match(/(.{5})/g) || [];
output = outputArray.join(" ");
}
if (translation === BACON_TRANSLATION_AB) {
output = output.replace(/[01]/g, function (c) {
return {
"0": "A",
"1": "B"
}[c];
});
}
return output;
}
}
export default BaconCipherEncode;