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); }
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())); }