public void GetRoundSnapshot() { for (int i = 0; i < 25; i++) { EncodingPlan result = instance.GetEncodingPlan(blockLength: 64); Assert.IsNotNull(result); Assert.IsTrue(result.WordSize >= BlockEncoder.MinWordSize && result.WordSize <= BlockEncoder.MaxWordSize); List <IWordEncoder> transformations = result.Transformations; Assert.IsTrue(transformations.Count > 0); } }
public byte[] EncodeBlock(EncodingPlan plan, byte[] block) { byte[] result = new byte[block.Length]; List <BitArray> words = new BitArray(block).ToWords(plan.WordSize); int wordCount = words.Count; for (int i = 0; i < wordCount; i++) { IWordEncoder encoder = plan.Transformations[i]; BitArray encoded = encoder.Encode(words[i]); words[i] = encoded; } words.ToBitArray().CopyTo(result, 0); return(result); }
public byte[] DecodeBlock(EncodingPlan plan, byte[] block) { byte[] result = new byte[block.Length]; List <BitArray> buffer = new List <BitArray> { }; List <BitArray> words = new BitArray(block).ToWords(plan.WordSize); for (int i = words.Count - 1; i >= 0; i--) { IWordEncoder decoder = plan.Transformations[i]; BitArray decoded = decoder.Decode(words[i]); buffer.Insert(0, decoded); } buffer.ToBitArray().CopyTo(result, 0); return(result); }
public EncodingPlan GetEncodingPlan(int blockLength) { EncodingPlan result = new EncodingPlan(); result.WordSize = wordSize; int transformsCount = Transforms.Length; int bitsInBlock = blockLength * 8; int remainder = bitsInBlock % wordSize; bool hasRemainder = remainder != 0; int wordCount = (int)Math.Ceiling((double)bitsInBlock / wordSize); for (int index = 0; index < wordCount; index++) { int wordLength = (index == wordCount - 1 && hasRemainder ? remainder : wordSize); IWordEncoder encoder = (IWordEncoder)Activator.CreateInstance(transforms[index % transformsCount].GetType()); encoder.WordSize = wordLength; encoder.Seed = KeySchedule.GetNext(encoder.SeedSize); result.Transformations.Add(encoder); } return(result); }