CryptoWorkbench/caesarian.csharp

89 lines
3.5 KiB
Plaintext

using System;
using System.Linq;
using System.IO;
using System.Text;
using System.Collections.Generic;
namespace AniNIX.Crypto {
public class Caesarian : Cipher {
public override String Description() { return "Caesarian cipher suite\nKey format is a numeric shift."; }
public override String Command() { return "caesar"; }
public Caesarian(Workbench w) : base (w) {}
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 "brute":
BruteForce(workSpace);
return workSpace;
default:
GetHelp();
return workSpace;
}
}
public override void GetHelp() {
Console.WriteLine(String.Format("Help for the {0} cipher suite.\n{1}\n",Command(),Description()));
Console.WriteLine("encrypt key -- encrypt with the key\ndecrypt key -- decrypt with the key\nbrute -- brute-force for keys\nhelp -- show this helptext.");
}
public override String Encrypt(String workSpace,String inputText,String[] line) {
if (line.Length != 3) {
Console.Error.WriteLine("Bad formatting");
return workSpace;
}
int rotation = 0;
try {
rotation = Int32.Parse(line[2]);
} catch (Exception e) {
Console.Error.WriteLine("Error in parsing rotation value -- should be numeric.");
Console.Error.WriteLine(e.Message);
return workSpace;
}
char[] modified = workSpace.ToCharArray();
for (int i = 0; i < modified.Length; i++) {
if (Char.IsLetter(modified[i])) {
int baseC;
int modC;
if (modified[i] < 'a') {
baseC = (int)'A';
modC = (int)modified[i] - (int)'A';
} else {
baseC = (int)'a';
modC = (int)modified[i] - (int)'a';
}
modC = (modC + rotation)%26;
//Debugging
//Console.Write(String.Format("Updating index {0} <{5}> val {1} base {2} mod {3} rotation {4} --to-- ",i,(int)modified[i],baseC,modC,rotation,modified[i]));
modified[i] = (char)(baseC+modC);
//Console.WriteLine(String.Format("<{0}> val {1}",modified[i],baseC+modC));
}
}
return new String(modified);
}
public override String Decrypt(String workSpace,String inputText,String[] line) {
return Encrypt(workSpace,inputText,line);
}
public void BruteForce(String workSpace) {
String[] line = new String[3];
line[0] = "rot";
line[1] = "encrypt";
for (int i=0; i<26; i++) {
line[2]=i.ToString();
Console.Write(String.Format("{0,2}: {1}",i,Encrypt(workSpace,null,line)));
}
}
}
}