CryptoWorkbench/substitution.csharp
cxford 65dbd8cae2 Converting from Bazaar
Old Log:
------------------------------------------------------------
revno: 16
committer: cxford <cxford@aninix.net>
branch nick: CryptoWorkbench
timestamp: Sun 2016-07-10 20:22:37 -0500
message:
  Some fixes for regex, captive shells, analysis
------------------------------------------------------------
revno: 15
committer: dev <dev@aninix.net>
branch nick: CryptoWorkbench
timestamp: Thu 2016-07-07 13:54:04 -0500
message:
  Adding captivecrypto.bash shell to go with ForceCommand
------------------------------------------------------------
revno: 14
committer: dev <dev@aninix.net>
branch nick: CryptoWorkbench
timestamp: Thu 2016-07-07 13:38:21 -0500
message:
  Updating
------------------------------------------------------------
revno: 13
committer: cxford <cxford@aninix.net>
branch nick: CryptoWorkbench
timestamp: Tue 2016-07-05 13:20:34 -0500
message:
  Adding inline regex lookup
  Updating ciphers to use standard constructor -- now ciphers can be added from new class, new private in WorkBench, and new instantiation in Workbench constructor
------------------------------------------------------------
revno: 12
committer: dev <dev@aninix.net>
branch nick: CryptoWorkbench
timestamp: Sat 2016-06-18 10:16:40 -0500
message:
  GUI enhancements for colorizing. General updates.
------------------------------------------------------------
revno: 11
committer: dev <dev@aninix.net>
branch nick: CryptoWorkbench
timestamp: Mon 2016-05-09 12:21:57 -0500
message:
  Updated letter frequency in analysis
  Added reverse function in Simple
  Updated bash script with small fixes
  Updated cryptoworkbench Links function with link to frequency analysis
------------------------------------------------------------
revno: 10
committer: dev <dev@aninix.net>
branch nick: CryptoWorkbench
timestamp: Fri 2016-04-15 13:03:41 -0500
message:
  Syncing with new ciphers for Affine, Ubchi, Vignere, and Columnar Transposition. Analytics updated and general fixes included. Paradigm shift for cipher inheritance.
------------------------------------------------------------
revno: 9
committer: cxford <cxford@aninix.net>
branch nick: CryptoWorkbench
timestamp: Wed 2016-02-10 15:36:37 -0600
message:
  Added new class for simple operations, like string to upper/lower and removing spaces.
  Updated with file reading and writing.
  Added brute-force for Caesarian ciphers.
  Updated substition and analysis for better options.
  Improved CLI
------------------------------------------------------------
revno: 8
committer: root <root@aninix.net>
branch nick: CryptoWorkbench
timestamp: Mon 2016-02-01 13:44:20 -0600
message:
  Modified analysis to display doubled letters and notify of which letter is repeated when One-to-one query fails to find a one-to-one relationship
------------------------------------------------------------
revno: 7
committer: root <root@aninix.net>
branch nick: CryptoWorkbench
timestamp: Thu 2016-01-28 10:03:40 -0600
message:
  Lots of minor fixes.
------------------------------------------------------------
revno: 6
committer: root <root@aninix.net>
branch nick: CryptoWorkbench
timestamp: Wed 2016-01-20 09:29:54 -0600
message:
  Makefile had a small typo but it prevented installs. Worth a commit.
------------------------------------------------------------
revno: 5
committer: root <root@aninix.net>
branch nick: CryptoWorkbench
timestamp: Tue 2016-01-19 13:12:12 -0600
message:
  Added one-to-one query to Analysis for checking if a substitution or rotation remains one-to-one and to acquire the key
  Moved bash script to ease tab-completion
------------------------------------------------------------
revno: 4
committer: root <root@aninix.net>
branch nick: CryptoWorkbench
timestamp: Thu 2016-01-14 10:24:02 -0600
message:
  Renamed README to be consistent with other branches in repo.
  Added Caesarian functions
  Added analysis and substitution functions for letter substitution.
------------------------------------------------------------
revno: 3
committer: cxford <cxford@aninix.net>
branch nick: CryptoWorkbench
timestamp: Wed 2016-01-13 16:41:05 -0600
message:
  Added install files
------------------------------------------------------------
revno: 2
committer: cxford <cxford@aninix.net>
branch nick: CryptoWorkbench
timestamp: Wed 2016-01-13 16:30:10 -0600
message:
  Adding Makefile and source files.
------------------------------------------------------------
revno: 1
committer: cxford <cxford@aninix.net>
branch nick: CryptoWorkbench
timestamp: Wed 2016-01-13 10:29:31 -0600
message:
  Initializing project tree and adding Readme.
2016-08-04 12:10:50 -05:00

103 lines
5.1 KiB
Plaintext

using System;
using System.IO;
using System.Text;
using System.Collections.Generic;
namespace AniNIX.Crypto {
public class Substitution : Cipher {
public char[] EngCommon = {'e','t','a','o','i','n','s','h','r','d','l','u','c','m','w','f','y','g','p','b','v','k','x','j','q','z'};
public override String Description() { return "Subsitution cipher suite\nKey format is \"E[EEE]=d[ddd]\", where E is the character in the cipher and d is the intended character in the workspace."; }
public override String Command() { return "sub"; }
public Substitution(Workbench w) : base (w) {}
/// <summary>
/// We should be able to act on a workspace and command line. Most ciphers will sue the same syntax. Those that don't can override.
/// </summary>
/// <param name=workSpace>The current version of the text being worked on.</param>
/// <param name=line>The command sequence.</param>
/// <returns>The updated version of the workSpace</returns>
public override String RunCommand(String workSpace,String inputText,String[] line) {
if (workSpace == null || line == null || line.Length < 2) {
Console.Error.WriteLine("Malformed request.");
return workSpace;
}
switch (line[1]) {
case "encrypt":
return Encrypt(workSpace,inputText,line);
case "decrypt":
return Decrypt(workSpace,inputText,line);
case "try-common":
return TryCommon(inputText);
case "help":
GetHelp();
return workSpace;
default:
Console.Error.WriteLine("Invalid command. Type help for more.");
return workSpace;
}
}
/// <summary>
/// Show the helptext for this cipher. By default, most ciphers will only have encrypt, decrypt, and help functions.
/// </summary>
/// <param name=line>This is the incoming line and we use it to get the cipher name</param>
public override void GetHelp() {
Console.WriteLine(String.Format("Help for the {0} cipher suite.\n{1}\n",Command(),Description()));
Console.WriteLine("encrypt key[s] -- encrypt with the key[s]\ndecrypt key[s] -- decrypt with the key[s]\ntry-common -- try common sub keys\nhelp -- show this helptext.");
}
public override String Encrypt(String workSpace, String cipher, String[] line) {
if (line.Length < 3) {
Console.Error.WriteLine("Bad formatting.");
return workSpace;
}
char[] changed = workSpace.ToCharArray();
for (int i=2; i<line.Length;i++) {
if (line[i].Length < 3 || line[i].Length%2 != 1 || line[i][line[i].Length/2] != '=') {
Console.Error.WriteLine("Bad substitution. Aborting.");
/* Console.Error.WriteLine(String.Format("Line length: {0}",line[i].Length));
* Console.Error.WriteLine(String.Format("Line mod 2: {0}",line[i].Length%2));
* Console.Error.WriteLine(String.Format("Line[length/2+1]: {0}",line[i][line[i].Length/2+1]));
*/
return workSpace;
}
for (int k = 0; k < line[i].Length/2; k++) {
char oldS = line[i].Substring(k,1)[0];
char newS = line[i].Substring(k+line[i].Length/2+1,1)[0];
Console.WriteLine(String.Format("Replacing cipher {0} to be workspace {1}",oldS,newS));
for (int j = 0; j < workSpace.Length; j++) {
if (cipher[j] == oldS) {
changed[j] = newS;
}
}
}
}
return new String(changed);
}
public override String Decrypt(String workSpace, String cipher, String[] line) {
return Encrypt(workSpace, cipher, line);
}
public String TryCommon(String workSpace) {
List<String> sortedChars = Analysis.GetMostCommonLetters(workSpace.ToLower());
char[] modified = workSpace.ToLower().ToCharArray();
char replaceChar;
for (int i = 0; i < modified.Length; i++) {
if (!Char.IsLetter(modified[i])) { continue; }
Console.WriteLine(String.Format("Character <{0}> occurs {1}st in frequency, corresponding with <{2}> -- replacing...",
modified[i],
sortedChars.IndexOf(modified[i].ToString()),
EngCommon[sortedChars.IndexOf(modified[i].ToString())]));
replaceChar = EngCommon[sortedChars.IndexOf(modified[i].ToString())];
replaceChar = (workSpace[i] == Char.ToLower(workSpace[i])) ? replaceChar : Char.ToUpper(replaceChar);
modified[i] = replaceChar;
}
return new String(modified);
}
}
}