CryptoWorkbench/affine.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

82 lines
3.2 KiB
Plaintext

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections.Generic;
namespace AniNIX.Crypto {
public class Affine : Cipher {
public override String Description() { return "The Affine cipher\nKey format is two numbers, where the second number is coprime to the first."; }
public override String Command() {return "affine";}
public Affine(Workbench w) : base (w) {}
public override String Encrypt(String workSpace,String inputText,String[] line) {
if (line == null || line.Length != 4) {
Console.Error.WriteLine("Malformed!");
return workSpace;
}
char[] changed = workSpace.ToCharArray();
try {
int a = Int32.Parse(line[2]);
try {
MultiplicativeInverse(a);
} catch (Exception e) {
Console.Error.WriteLine(String.Format("Value a <{0}> is not coprime to 26.\n{1}",a,e.Message));
return workSpace;
}
int b = Int32.Parse(line[3]);
for (int i = 0; i < changed.Length; i++) {
if (Char.IsLetter(changed[i])) {
int baseC = (Char.IsUpper(changed[i])) ? (int)'A' : (int)'a';
int modC = (int)changed[i] - baseC;
changed[i] = (char)(((a*modC+b)%26)+baseC);
}
}
} catch (Exception e) {
Console.Error.WriteLine(String.Format("Failed!\n{0}",e.Message));
return workSpace;
}
return new String(changed);
}
public int MultiplicativeInverse(int a) {
for (int x=1; x < 27; x++) {
if ((a*x)%26 == 1) {
Console.WriteLine(String.Format("Found Multiplicative Inverse of {0}",x));
return x;
}
}
throw new Exception("A is not coprime.");
}
public override String Decrypt(String workSpace,String inputText,String[] line) {
if (line == null || line.Length != 4) {
Console.Error.WriteLine("Malformed!");
return workSpace;
}
char[] changed = workSpace.ToCharArray();
try {
int a = Int32.Parse(line[2]);
int b = Int32.Parse(line[3]);
int multiinv = MultiplicativeInverse(a);
for (int i = 0; i < changed.Length; i++) {
if (Char.IsLetter(changed[i])) {
int baseC = (Char.IsUpper(changed[i])) ? (int)'A' : (int)'a';
int modC = (int)changed[i] - baseC;
int modResult = (multiinv * (modC-b))%26;
modResult = (modResult < 0) ? modResult+26 : modResult; // In case modResult is negative, add 26 back
changed[i] = (char)(modResult+baseC);
}
}
} catch (Exception e) {
Console.Error.WriteLine(String.Format("Failed!\n{0}",e.Message));
return workSpace;
}
return new String(changed);
}
}
}