Beispiel #1
0
 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);
     }
 }
Beispiel #2
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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }