Using cryptographic analysis on a cipher produced by an existing software program, I was able to write my own compatible algorithm for re-producing the cipher. The only trouble is I have no idea which cipher it is. Perhaps combinations of different ciphers or maybe even a new cipher all together? No, I won’t say which software program uses this cipher, but I wonder if anyone can identify and/or classify it. I believe it to be a symmetric key stream cipher–albeit, very weak and very easy to analyze.
Disclaimer: I invoke my right to free speech to post cryptographic source code. See Bernstein v. United States.
Usage Examples:
Console.WriteLine(Convert.ToBase64String("mypassword".Cipher("378518030611953"))); // or Console.WriteLine("mypassword".Cipher("378518030611953").ToHexString()); // or Console.WriteLine("mypassword".Cipher(ASCIIEncoding.ASCII.GetBytes("somekey")).ToHexString());
Corresponding Output Examples:
// y8kJikhp6ItISg== // or // cbc9098a4869e88b484a // or // c5c4a58605c4c785a527
The Code:
using System; using System.Text; namespace MyExtensions { public static class Extensions { public static byte[] Cipher(this string password, string key) { byte[] cipher = System.Text.ASCIIEncoding.ASCII.GetBytes(password); return cipher.Cipher(key); } public static byte[] Cipher(this string password, byte[] key) { byte[] cipher = System.Text.ASCIIEncoding.ASCII.GetBytes(password); return cipher.Cipher(key); } public static byte[] Cipher(this byte[] password, string key) { try { byte[] k = key.ParseBytes(); return password.Cipher(k); } catch (Exception e) { throw new Exception("The key can consist only of a string of numbers. No letters or special characters.", e); } } public static byte[] Cipher(this byte[] password, byte[] key) { byte[] cipher = password; for (int i = 0; i < cipher.Length; i++) { int first = 0x09; int last = 0xE9; int rounds = cipher[i] ^ key[i % key.Length]; for (int y = 0; y <= rounds; y++) { last += 32; if (last > 255) last = first = first + (y % 16 / 2) - 3; if (last < 0) last = first = 14; } cipher[i] = (byte)last; } return cipher; } public static byte[] ParseBytes(this string s) { return s.ToCharArray().ParseBytes(); } public static byte[] ParseBytes(this char[] data) { byte[] p = new byte[data.Length]; for (int i = 0; i < data.Length; i++) { byte parsed; if (!byte.TryParse(data[i].ToString(), out parsed)) throw new Exception("The input can only consist of numbers. No letters or special characters."); p[i] = parsed; } return p; } public static string ToHexString(this byte[] data) { string s = string.Empty; for (int i = 0; i < data.Length; i++) { s += data[i].ToHexString(); } return s; } public static string ToHexString(this byte b) { return Convert.ToString(b, 16).PadLeft(2, "0"); } public static string PadLeft(this string s, int totalWidth, string padding) { return s.PadLeft(totalWidth, char.Parse(padding)); } public static string PadRight(this string s, int totalWidth, string padding) { return s.PadRight(totalWidth, char.Parse(padding)); } } }