Skip to content

Commit

Permalink
Merge branch 'jarmovanlenthe-master'
Browse files Browse the repository at this point in the history
  • Loading branch information
n1474335 committed Dec 15, 2018
2 parents 31cbf8c + 50f078c commit 2f68bf3
Show file tree
Hide file tree
Showing 5 changed files with 166 additions and 1 deletion.
8 changes: 7 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
# Changelog
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).

### [8.13.0] - 2018-12-15
- 'A1Z26 Cipher Encode' and 'A1Z26 Cipher Decode' operations added [@jarmovanlenthe] | [#441]

### [8.12.0] - 2018-11-21
- 'Citrix CTX1 Encode' and 'Citrix CTX1 Decode' operations added [@bwhitn] | [#428]

Expand All @@ -20,7 +23,7 @@ All major and minor version changes will be documented in this file. Details of
- 'JWT Sign', 'JWT Verify' and 'JWT Decode' operations added [@GCHQ77703] | [#348]

### [8.6.0] - 2018-08-29
- 'To Geohash' and 'From Geohash' operations added [@GCHQ77703] | [#344]
- 'To Geohash' and 'From Geohash' operations added [@GCHQ77703] | [#344]

### [8.5.0] - 2018-08-23
- 'To Braille' and 'From Braille' operations added [@n1474335] | [#255]
Expand Down Expand Up @@ -66,6 +69,7 @@ All major and minor version changes will be documented in this file. Details of



[8.13.0]: https://github.com/gchq/CyberChef/releases/tag/v8.13.0
[8.12.0]: https://github.com/gchq/CyberChef/releases/tag/v8.12.0
[8.11.0]: https://github.com/gchq/CyberChef/releases/tag/v8.11.0
[8.10.0]: https://github.com/gchq/CyberChef/releases/tag/v8.10.0
Expand Down Expand Up @@ -96,6 +100,7 @@ All major and minor version changes will be documented in this file. Details of
[@arnydo]: https://github.com/arnydo
[@klaxon1]: https://github.com/klaxon1
[@bwhitn]: https://github.com/bwhitn
[@jarmovanlenthe]: https://github.com/jarmovanlenthe

[#95]: https://github.com/gchq/CyberChef/pull/299
[#173]: https://github.com/gchq/CyberChef/pull/173
Expand All @@ -119,3 +124,4 @@ All major and minor version changes will be documented in this file. Details of
[#387]: https://github.com/gchq/CyberChef/pull/387
[#394]: https://github.com/gchq/CyberChef/pull/394
[#428]: https://github.com/gchq/CyberChef/pull/428
[#441]: https://github.com/gchq/CyberChef/pull/441
2 changes: 2 additions & 0 deletions src/core/config/Categories.json
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@
"Bifid Cipher Decode",
"Affine Cipher Encode",
"Affine Cipher Decode",
"A1Z26 Cipher Encode",
"A1Z26 Cipher Decode",
"Atbash Cipher",
"Substitute",
"Derive PBKDF2 key",
Expand Down
63 changes: 63 additions & 0 deletions src/core/operations/A1Z26CipherDecode.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
/**
* @author Jarmo van Lenthe [github.com/jarmovanlenthe]
* @copyright Crown Copyright 2018
* @license Apache-2.0
*/

import Operation from "../Operation";
import Utils from "../Utils";
import {DELIM_OPTIONS} from "../lib/Delim";
import OperationError from "../errors/OperationError";

/**
* A1Z26 Cipher Decode operation
*/
class A1Z26CipherDecode extends Operation {

/**
* A1Z26CipherDecode constructor
*/
constructor() {
super();

this.name = "A1Z26 Cipher Decode";
this.module = "Ciphers";
this.description = "Converts alphabet order numbers into their corresponding alphabet character.<br><br>e.g. <code>1</code> becomes <code>a</code> and <code>2</code> becomes <code>b</code>.";
this.infoURL = "";
this.inputType = "string";
this.outputType = "string";
this.args = [
{
name: "Delimiter",
type: "option",
value: DELIM_OPTIONS
}
];
}

/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const delim = Utils.charRep(args[0] || "Space");

if (input.length === 0) {
return [];
}

const bites = input.split(delim);
let latin1 = "";
for (let i = 0; i < bites.length; i++) {
if (bites[i] < 1 || bites[i] > 26) {
throw new OperationError("Error: all numbers must be between 1 and 26.");
}
latin1 += Utils.chr(parseInt(bites[i], 10) + 96);
}
return latin1;
}

}

export default A1Z26CipherDecode;
61 changes: 61 additions & 0 deletions src/core/operations/A1Z26CipherEncode.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
/**
* @author Jarmo van Lenthe [github.com/jarmovanlenthe]
* @copyright Crown Copyright 2018
* @license Apache-2.0
*/

import Operation from "../Operation";
import Utils from "../Utils";
import {DELIM_OPTIONS} from "../lib/Delim";

/**
* A1Z26 Cipher Encode operation
*/
class A1Z26CipherEncode extends Operation {

/**
* A1Z26CipherEncode constructor
*/
constructor() {
super();

this.name = "A1Z26 Cipher Encode";
this.module = "Ciphers";
this.description = "Converts alphabet characters into their corresponding alphabet order number.<br><br>e.g. <code>a</code> becomes <code>1</code> and <code>b</code> becomes <code>2</code>.<br><br>Non-alphabet characters are dropped.";
this.infoURL = "";
this.inputType = "string";
this.outputType = "string";
this.args = [
{
name: "Delimiter",
type: "option",
value: DELIM_OPTIONS
}
];
}

/**
* @param {string} input
* @param {Object[]} args
* @returns {string}
*/
run(input, args) {
const delim = Utils.charRep(args[0] || "Space");
let output = "";

const sanitizedinput = input.toLowerCase(),
charcode = Utils.strToCharcode(sanitizedinput);

for (let i = 0; i < charcode.length; i++) {
const ordinal = charcode[i] - 96;

if (ordinal > 0 && ordinal <= 26) {
output += ordinal.toString(10) + delim;
}
}
return output.slice(0, -delim.length);
}

}

export default A1Z26CipherEncode;
33 changes: 33 additions & 0 deletions test/tests/operations/Ciphers.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,39 @@ TestRegister.addTests([
}
],
},
{
name: "A1Z26 Encode: normal",
input: "This is the test sentence.",
expectedOutput: "20 8 9 19 9 19 20 8 5 20 5 19 20 19 5 14 20 5 14 3 5",
recipeConfig: [
{
op: "A1Z26 Cipher Encode",
args: ["Space"]
}
],
},
{
name: "A1Z26 Decode: normal",
input: "20 8 9 19 9 19 20 8 5 20 5 19 20 19 5 14 20 5 14 3 5",
expectedOutput: "thisisthetestsentence",
recipeConfig: [
{
op: "A1Z26 Cipher Decode",
args: ["Space"]
}
],
},
{
name: "A1Z26 Decode: error",
input: "20 8 9 27",
expectedOutput: "Error: all numbers must be between 1 and 26.",
recipeConfig: [
{
op: "A1Z26 Cipher Decode",
args: ["Space"]
}
],
},
{
name: "Atbash: no input",
input: "",
Expand Down

0 comments on commit 2f68bf3

Please sign in to comment.