Merge branch 'Flavsditz-master'

This commit is contained in:
n1474335 2020-02-13 15:09:08 +00:00
commit 36190f1967
5 changed files with 280 additions and 0 deletions

View File

@ -2,6 +2,9 @@
All major and minor version changes will be documented in this file. Details of patch-level version changes can be found in [commit messages](https://github.com/gchq/CyberChef/commits/master). All major and minor version changes will be documented in this file. Details of patch-level version changes can be found in [commit messages](https://github.com/gchq/CyberChef/commits/master).
### [9.13.0] - 2020-02-13
- 'Rail Fence Cipher Encode' and 'Rail Fence Cipher Decode' operations added [@Flavsditz] | [#948]
### [9.12.0] - 2019-12-20 ### [9.12.0] - 2019-12-20
- 'Normalise Unicode' operation added [@matthieuxyz] | [#912] - 'Normalise Unicode' operation added [@matthieuxyz] | [#912]
@ -200,6 +203,7 @@ All major and minor version changes will be documented in this file. Details of
[9.13.0]: https://github.com/gchq/CyberChef/releases/tag/v9.13.0
[9.12.0]: https://github.com/gchq/CyberChef/releases/tag/v9.12.0 [9.12.0]: https://github.com/gchq/CyberChef/releases/tag/v9.12.0
[9.11.0]: https://github.com/gchq/CyberChef/releases/tag/v9.11.0 [9.11.0]: https://github.com/gchq/CyberChef/releases/tag/v9.11.0
[9.10.0]: https://github.com/gchq/CyberChef/releases/tag/v9.10.0 [9.10.0]: https://github.com/gchq/CyberChef/releases/tag/v9.10.0
@ -286,6 +290,7 @@ All major and minor version changes will be documented in this file. Details of
[@VirtualColossus]: https://github.com/VirtualColossus [@VirtualColossus]: https://github.com/VirtualColossus
[@cbeuw]: https://github.com/cbeuw [@cbeuw]: https://github.com/cbeuw
[@matthieuxyz]: https://github.com/matthieuxyz [@matthieuxyz]: https://github.com/matthieuxyz
[@Flavsditz]: https://github.com/Flavsditz
[#95]: https://github.com/gchq/CyberChef/pull/299 [#95]: https://github.com/gchq/CyberChef/pull/299
[#173]: https://github.com/gchq/CyberChef/pull/173 [#173]: https://github.com/gchq/CyberChef/pull/173
@ -350,3 +355,4 @@ All major and minor version changes will be documented in this file. Details of
[#653]: https://github.com/gchq/CyberChef/pull/653 [#653]: https://github.com/gchq/CyberChef/pull/653
[#865]: https://github.com/gchq/CyberChef/pull/865 [#865]: https://github.com/gchq/CyberChef/pull/865
[#912]: https://github.com/gchq/CyberChef/pull/912 [#912]: https://github.com/gchq/CyberChef/pull/912
[#948]: https://github.com/gchq/CyberChef/pull/948

View File

@ -95,6 +95,8 @@
"Affine Cipher Decode", "Affine Cipher Decode",
"A1Z26 Cipher Encode", "A1Z26 Cipher Encode",
"A1Z26 Cipher Decode", "A1Z26 Cipher Decode",
"Rail Fence Cipher Encode",
"Rail Fence Cipher Decode",
"Atbash Cipher", "Atbash Cipher",
"Substitute", "Substitute",
"Derive PBKDF2 key", "Derive PBKDF2 key",

View File

@ -0,0 +1,88 @@
/**
* @author Flavio Diez [flaviofdiez+cyberchef@gmail.com]
* @copyright Crown Copyright 2020
* @license Apache-2.0
*/
import Operation from "../Operation.mjs";
import OperationError from "../errors/OperationError.mjs";
/**
* Rail Fence Cipher Decode operation
*/
class RailFenceCipherDecode extends Operation {
/**
* RailFenceCipherDecode constructor
*/
constructor() {
super();
this.name = "Rail Fence Cipher Decode";
this.module = "Ciphers";
this.description = "Decodes Strings that were created using the Rail fence Cipher provided a key and an offset";
this.infoURL = "https://wikipedia.org/wiki/Rail_fence_cipher";
this.inputType = "string";
this.outputType = "string";
this.args = [
{
name: "Key",
type: "number",
value: 2
},
{
name: "Offset",
type: "number",
value: 0
}
];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const [key, offset] = args;
let cipher = input;
if (key < 2) {
throw new OperationError("Key has to be bigger than 2");
} else if (key > cipher.length) {
throw new OperationError("Key should be smaller than the cipher's length");
}
if (offset < 0) {
throw new OperationError("Offset has to be a positive integer");
}
const cycle = (key - 1) * 2;
const rest = cipher.length % key;
if (rest !== 0) {
cipher = cipher + (" ".repeat(key - rest));
}
const plaintext = new Array(cipher.length);
let j = 0;
let x, y;
for (y = 0; y < key; y++) {
for (x = 0; x < cipher.length; x++) {
if ((y + x + offset) % cycle === 0 || (y - x - offset) % cycle === 0) {
plaintext[x] = cipher[j++];
}
}
}
return plaintext.join("").trim();
}
}
export default RailFenceCipherDecode;

View File

@ -0,0 +1,74 @@
/**
* @author Flavio Diez [flaviofdiez+cyberchef@gmail.com]
* @copyright Crown Copyright 2020
* @license Apache-2.0
*/
import Operation from "../Operation.mjs";
import OperationError from "../errors/OperationError.mjs";
/**
* Rail Fence Cipher Encode operation
*/
class RailFenceCipherEncode extends Operation {
/**
* RailFenceCipherEncode constructor
*/
constructor() {
super();
this.name = "Rail Fence Cipher Encode";
this.module = "Ciphers";
this.description = "Encodes Strings using the Rail fence Cipher provided a key and an offset";
this.infoURL = "https://wikipedia.org/wiki/Rail_fence_cipher";
this.inputType = "string";
this.outputType = "string";
this.args = [
{
name: "Key",
type: "number",
value: 2
},
{
name: "Offset",
type: "number",
value: 0
}
];
}
/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const [key, offset] = args;
const plaintext = input;
if (key < 2) {
throw new OperationError("Key has to be bigger than 2");
} else if (key > plaintext.length) {
throw new OperationError("Key should be smaller than the plain text's length");
}
if (offset < 0) {
throw new OperationError("Offset has to be a positive integer");
}
const cycle = (key - 1) * 2;
const rows = new Array(key).fill("");
for (let pos = 0; pos < plaintext.length; pos++) {
const rowIdx = key - 1 - Math.abs(cycle / 2 - (pos + offset) % cycle);
rows[rowIdx] += plaintext[pos];
}
return rows.join("").trim();
}
}
export default RailFenceCipherEncode;

View File

@ -418,4 +418,114 @@ TestRegister.addTests([
} }
], ],
}, },
{
name: "Rail Fence Cipher Decode: normal",
input: "Cytgah sTEAto rtn rsligcdsrporpyi H r fWiigo ovn oe",
expectedOutput: "Cryptography is THE Art of Writing or solving codes",
recipeConfig: [
{
"op": "Rail Fence Cipher Decode",
"args": [2, 0]
}
],
},
{
name: "Rail Fence Cipher Decode: key has to be bigger than 2",
input: "Cytgah sTEAto rtn rsligcdsrporpyi H r fWiigo ovn oe",
expectedOutput: "Key has to be bigger than 2",
recipeConfig: [
{
"op": "Rail Fence Cipher Decode",
"args": [1, 0]
}
],
},
{
name: "Rail Fence Cipher Decode: key has to be smaller than input's length",
input: "shortinput",
expectedOutput: "Key should be smaller than the cipher's length",
recipeConfig: [
{
"op": "Rail Fence Cipher Decode",
"args": [22, 0]
}
],
},
{
name: "Rail Fence Cipher Decode: offset should be positive",
input: "shortinput",
expectedOutput: "Offset has to be a positive integer",
recipeConfig: [
{
"op": "Rail Fence Cipher Decode",
"args": [2, -1]
}
],
},
{
name: "Rail Fence Cipher Decode: Normal with Offset non-null",
input: "51746026813793592840",
expectedOutput: "12345678901234567890",
recipeConfig: [
{
"op": "Rail Fence Cipher Decode",
"args": [4, 2]
}
],
},
{
name: "Rail Fence Cipher Encode: normal",
input: "Cryptography is THE Art of Writing or solving codes",
expectedOutput: "Cytgah sTEAto rtn rsligcdsrporpyi H r fWiigo ovn oe",
recipeConfig: [
{
"op": "Rail Fence Cipher Encode",
"args": [2, 0]
}
],
},
{
name: "Rail Fence Cipher Encode: key has to be bigger than 2",
input: "Cryptography is THE Art of Writing or solving codes",
expectedOutput: "Key has to be bigger than 2",
recipeConfig: [
{
"op": "Rail Fence Cipher Encode",
"args": [1, 0]
}
],
},
{
name: "Rail Fence Cipher Encode: key has to be smaller than input's length",
input: "shortinput",
expectedOutput: "Key should be smaller than the plain text's length",
recipeConfig: [
{
"op": "Rail Fence Cipher Encode",
"args": [22, 0]
}
],
},
{
name: "Rail Fence Cipher Encode: offset should be positive",
input: "shortinput",
expectedOutput: "Offset has to be a positive integer",
recipeConfig: [
{
"op": "Rail Fence Cipher Encode",
"args": [2, -1]
}
],
},
{
name: "Rail Fence Cipher Encode: Normal with Offset non-null",
input: "12345678901234567890",
expectedOutput: "51746026813793592840",
recipeConfig: [
{
"op": "Rail Fence Cipher Encode",
"args": [4, 2]
}
],
},
]); ]);