public void Encrypt(IVocabularyProvider data, string what, Stream writer) { int overhead = 0; long padding = writer.Position; var rnd = new Random(); using (var briter = new BinaryWriter(writer, Encoding.Default, true)) { foreach (char t in what) { for (int j = 0; j < 4; j++) { var ch = (ushort)(t & 0xF << 4 * j ^ data.Next()); briter.Write(ch); } if (t % 3 == 0) { briter.Write((short)rnd.Next(1023, 65535)); overhead++; } if (t % 2 == 0) { briter.Write((short)rnd.Next(1023, 65535)); overhead++; } } } writer.SetLength(padding + what.Length * 8 + overhead * 2); }
public string Decrypt(IVocabularyProvider data, Stream reader) { int overhead = 0; var builder = new StringBuilder(); long readerLength = reader.Length, streamLength = readerLength - reader.Position; using (var breader = new BinaryReader(reader, Encoding.Default, true)) { while (builder.Length < (streamLength - overhead * 2) / 8 && readerLength >= reader.Position + 8) { char x = default; for (int j = 0; j < 4; j++) { var z = breader.ReadInt16(); var y = (char)(z ^ data.Next()); x |= y; } if (x % 3 == 0 && readerLength >= reader.Position + 2) { breader.ReadInt16(); overhead++; } if (x % 2 == 0 && readerLength >= reader.Position + 2) { breader.ReadInt16(); overhead++; } builder.Append(x); } } return(builder.ToString()); }
private static CryptoDataV2 CheckCryptoData(IVocabularyProvider data) { if (!(data is CryptoDataV2 datav2)) { throw new Exception("CryptorV2 expects CryptoDataV2 or later version as IVocabularyProvider"); } return(datav2); }
public static string Decrypt(IVocabularyProvider data, Stream reader) { foreach (var cryptor in Cryptors) { if (cryptor.CanDecrypt(reader)) { return(cryptor.Decrypt(data, reader)); } } return(null); }
public virtual string Decrypt(IVocabularyProvider data, Stream reader) { var offset = (reader.ReadByte() ^ data.Next()) & 0xFF; reader.Position = offset; for (int i = 0; i < (offset - (Magic.Length + 1) & 0xF); i++) { data.Next(); } return(LegacyCryptor.Singleton.Decrypt(data, reader)); }
public virtual void Encrypt(IVocabularyProvider data, string what, Stream writer) { writer.Write(Magic, 0, Magic.Length); var rnd = new Random(); var garbageCount = rnd.Next(10, 250); var totalPadding = (byte)((garbageCount + Magic.Length + 1 ^ data.Next()) & 0xFF); var buffer = new byte[garbageCount + 1]; rnd.NextBytes(buffer); buffer[0] = totalPadding; writer.Write(buffer, 0, buffer.Length); for (int i = 0; i < (garbageCount & 0xF); i++) { data.Next(); } LegacyCryptor.Singleton.Encrypt(data, what, writer); }
public static void Encrypt(IVocabularyProvider data, string what, Stream writer) { Cryptors[0].Encrypt(data, what, writer); }
public override void Encrypt(IVocabularyProvider data, string what, Stream writer) { base.Encrypt(CheckCryptoData(data).UpgradeToV2(), what, writer); }
public override string Decrypt(IVocabularyProvider data, Stream reader) { return(base.Decrypt(CheckCryptoData(data).UpgradeToV2(), reader)); }