فهرست منبع

Merge branch 'master' of https://github.com/valdelaseras/CyberChef

n1474335 3 سال پیش
والد
کامیت
6b16f11d3b

+ 2 - 0
src/core/config/Categories.json

@@ -77,6 +77,8 @@
             "Blowfish Decrypt",
             "DES Encrypt",
             "DES Decrypt",
+            "Cetacean Cipher Encode",
+            "Cetacean Cipher Decode",
             "Triple DES Encrypt",
             "Triple DES Decrypt",
             "LS47 Encrypt",

+ 64 - 0
src/core/operations/CetaceanCipherDecode.mjs

@@ -0,0 +1,64 @@
+/**
+ * @author dolphinOnKeys [robin@weird.io]
+ * @copyright Crown Copyright 2022
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+
+/**
+ * Cetacean Cipher Decode operation
+ */
+class CetaceanCipherDecode extends Operation {
+
+    /**
+     * CetaceanCipherDecode constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "Cetacean Cipher Decode";
+        this.module = "Ciphers";
+        this.description = "Decode Cetacean Cipher input. <br/><br/>e.g. <code>EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe</code> becomes <code>hi</code>";
+        this.infoURL = "";
+        this.inputType = "string";
+        this.outputType = "string";
+
+        this.checks = [
+            {
+                pattern: "^(?:[eE]{16,})(?: [eE]{16,})*$",
+                flags: "",
+                args: []
+            }
+        ]
+    }
+
+    /**
+     * @param {string} input
+     * @param {Object[]} args
+     * @returns {string}
+     */
+    run(input, args) {
+        const binaryArray = [];
+        for ( const char of input ) {
+            if ( char === ' ' ) {
+                binaryArray.push(...[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ]);
+            } else {
+                binaryArray.push( char === 'e' ? 1 : 0 );
+            }
+        }
+
+        const byteArray = [];
+
+        for ( let i = 0;  i < binaryArray.length; i += 16 ) {
+            byteArray.push(binaryArray.slice(i, i + 16).join(''))
+        }
+
+        return byteArray.map( byte =>
+            String.fromCharCode(parseInt( byte , 2 )
+            )
+        ).join('');
+    }
+}
+
+export default CetaceanCipherDecode;

+ 54 - 0
src/core/operations/CetaceanCipherEncode.mjs

@@ -0,0 +1,54 @@
+/**
+ * @author dolphinOnKeys [robin@weird.io]
+ * @copyright Crown Copyright 2022
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+
+/**
+ * Cetacean Cipher Encode operation
+ */
+class CetaceanCipherEncode extends Operation {
+
+    /**
+     * CetaceanCipherEncode constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "Cetacean Cipher Encode";
+        this.module = "Ciphers";
+        this.description = "Converts any input into Cetacean Cipher. <br/><br/>e.g. <code>hi</code> becomes <code>EEEEEEEEEeeEeEEEEEEEEEEEEeeEeEEe</code>\"";
+        this.infoURL = "";
+        this.inputType = "string";
+        this.outputType = "string";
+    }
+
+    /**
+     * @param {string} input
+     * @param {Object[]} args
+     * @returns {string}
+     */
+    run(input, args) {
+        let result = [];
+        let charArray = input.split('');
+
+        charArray.map( ( character ) => {
+            if ( character === ' ' ) {
+                result.push( character );
+            } else {
+                const binaryArray = this.encodeToBinary( character ).split('');
+                result.push( binaryArray.map(( str ) => str === '1' ? 'e' : 'E' ).join(''));
+            }
+        });
+
+        return result.join('');
+    }
+
+    encodeToBinary( char, padding = 16 ) {
+        return char.charCodeAt(0).toString(2).padStart( padding, '0');
+    }
+}
+
+export default CetaceanCipherEncode;

+ 2 - 0
tests/operations/index.mjs

@@ -28,6 +28,8 @@ import "./tests/Base85.mjs";
 import "./tests/BitwiseOp.mjs";
 import "./tests/ByteRepr.mjs";
 import "./tests/CartesianProduct.mjs";
+import "./tests/CetaceanCipherEncode.mjs";
+import "./tests/CetaceanCipherDecode.mjs";
 import "./tests/CharEnc.mjs";
 import "./tests/ChangeIPFormat.mjs";
 import "./tests/Charts.mjs";

+ 22 - 0
tests/operations/tests/CetaceanCipherDecode.mjs

@@ -0,0 +1,22 @@
+/**
+ * CetaceanCipher Encode tests
+ *
+ * @author dolphinOnKeys
+ * @copyright Crown Copyright 2022
+ * @licence Apache-2.0
+ */
+import TestRegister from "../../lib/TestRegister.mjs";
+
+TestRegister.addTests([
+    {
+        name: "Cetacean Cipher Decode",
+        input: "EEEEEEEEEeeEEEEe EEEEEEEEEeeEEEeE EEEEEEEEEeeEEEee EEeeEEEEEeeEEeee",
+        expectedOutput: "a b c で",
+        recipeConfig: [
+            {
+                op: "Cetacean Cipher Decode",
+                args: []
+            },
+        ],
+    }
+]);

+ 22 - 0
tests/operations/tests/CetaceanCipherEncode.mjs

@@ -0,0 +1,22 @@
+/**
+ * CetaceanCipher Encode tests
+ *
+ * @author dolphinOnKeys
+ * @copyright Crown Copyright 2022
+ * @licence Apache-2.0
+ */
+import TestRegister from "../../lib/TestRegister.mjs";
+
+TestRegister.addTests([
+    {
+        name: "Cetacean Cipher Encode",
+        input: "a b c で",
+        expectedOutput: "EEEEEEEEEeeEEEEe EEEEEEEEEeeEEEeE EEEEEEEEEeeEEEee EEeeEEEEEeeEEeee",
+        recipeConfig: [
+            {
+                op: "Cetacean Cipher Encode",
+                args: []
+            },
+        ],
+    }
+]);