コード例 #1
0
        private AFLN2Prefix DecomposePrefix(byte[] data)
        {
            AFLN2Prefix prefixObject = new AFLN2Prefix();
            List <Tuple <int, int> > paddingIndexes = new List <Tuple <int, int> >();

            string prefix         = null;
            string dataString     = Encoding.UTF8.GetString(data);
            int    prefixEndIndex = dataString.IndexOf(AFLN2Prefix.PrefixEndFormat) + 1;

            prefix = dataString.Substring(0, prefixEndIndex);
            prefixObject.Content = prefix;

            prefix = prefix.Replace(AFLN2Prefix.PrefixBeginFormat, "");
            prefix = prefix.Replace(AFLN2Prefix.PrefixEndFormat, "");

            if (prefix.Length > 0)
            {
                prefix = prefix.Substring(1);
                prefix = prefix.Substring(0, prefix.Length - 1);

                string[] splittedPrefix = prefix.Split(new string[] { String.Format("{0}{1}{2}", AFLN2Prefix.TupleEnd, AFLN2Prefix.IndexesSeparator, AFLN2Prefix.TupleBegin) }, StringSplitOptions.None);

                for (int i = 0; i < splittedPrefix.Length; i++)
                {
                    int[] items = splittedPrefix[i].Split(new string[] { AFLN2Prefix.IndexesSeparator }, StringSplitOptions.None).Select(x => Convert.ToInt32(x)).ToArray();

                    paddingIndexes.Add(Tuple.Create(items[0], items[1]));
                }
            }

            prefixObject.PaddingIndexes = paddingIndexes;

            return(prefixObject);
        }
コード例 #2
0
        public string Decrypt(string data)
        {
            byte[]      dataBytes     = null;
            byte[]      dataBytesAux  = Convert.FromBase64String(data);
            List <byte> decryptedData = new List <byte>();
            AFLN2Prefix prefix        = DecomposePrefix(dataBytesAux);

            dataBytes = new byte[dataBytesAux.Length - prefix.BytesLength];

            Buffer.BlockCopy(dataBytesAux, prefix.BytesLength, dataBytes, 0, dataBytes.Length);

            for (int i = 0, j = 0; i < dataBytes.Length; i += (this.KeyLength / 4), j++)
            {
                int              offset           = 0;
                byte[]           buffer           = new byte[this.KeyLength / 4];
                Tuple <int, int> indexOffsetTuple = prefix.PaddingIndexes.Where(x => x.Item1 == j).FirstOrDefault();

                if (indexOffsetTuple != null)
                {
                    offset = indexOffsetTuple.Item2;
                }

                Buffer.BlockCopy(dataBytes, i, buffer, 0, buffer.Length);

                BigInteger decryptedByte = BigInteger.ModPow(new BigInteger(buffer.Skip(offset).ToArray()), this.D, this.N);

                decryptedData.AddRange(decryptedByte.ToByteArray());
            }

            return(Encoding.UTF8.GetString(decryptedData.ToArray()));
        }