public bool TryDecodeData(GetRsaDelegate getRSA, byte[] bytes, out DeserializeResult deserializeResult)
        {
            var result = false;

            deserializeResult = null;

            var decodedBytes = _cryption.Decode(bytes, getRSA);

            if (decodedBytes != null && _formatChecker.Check(decodedBytes))
            {
                deserializeResult = _serializeProvider.Deserialize(decodedBytes);
                result            = true;
            }

            return(result);
        }
Beispiel #2
0
        /// <summary>Расшифровать массив</summary>
        /// <param name="result">Массив шифрации</param>
        /// <returns></returns>
        public unsafe byte[] Decode(byte[] mass, GetRsaDelegate getRSA)
        {
            byte[] result = mass.Clone() as byte[];

            uint UserID;

            fixed(void *numPtr = &result[result.Length - 4])
            {
                UserID = *(uint *)numPtr;
            }                             //id пользователя

            RSACryptoServiceProvider rsa;

            if (!getRSA(UserID, out rsa))
            {
                return(null);
            }

            crypt_struct urbytes, mrpass;

            int enckeyLength;

            {
                //длина внешнего пароля
                fixed(void *numPtr = &result[0])
                {
                    enckeyLength = *(int *)numPtr;
                }

                var tmass = new byte[enckeyLength];

                Array.Copy(result, 8, tmass, 0, enckeyLength);

                int m1ln, m2ln;

                fixed(void *numPtr = &result[0])
                {
                    m1ln = *(int *)numPtr;
                }

                fixed(void *numPtr = &result[4])
                {
                    m2ln = *(int *)numPtr;
                }

                urbytes = new crypt_struct(rsa.Decrypt(tmass, true));    //дешифрованный шифр   //тут все правильно!
            }

            //дешифрую основной и первый пароль вторым шифром
            {
                int Start = 8 + enckeyLength;
                int End   = result.Length - 4;

                for (int i = Start; i < End; i++)
                {
                    result[i] = urbytes.Decrypt(result[i]);
                }
            }

            {
                int mrpLength;   //длина внутреннего пароля
                fixed(void *numPtr = &result[4])
                {
                    mrpLength = *(int *)numPtr;
                }

                var tmass = new byte[mrpLength];
                Array.Copy(result, 8 + enckeyLength, tmass, 0, tmass.Length);

                mrpass = new crypt_struct(tmass);    //внутренний пароль смещения
            }

            //дешифрую основной набор первым шифром
            {
                int Start = mrpass.mass.Length + enckeyLength + 8;
                int End   = result.Length - 4;

                for (int i = Start; i < End; i++)
                {
                    result[i] = mrpass.Decrypt(result[i]);
                }
            }
            {
                int MassFrom   = mrpass.mass.Length + enckeyLength + 8;
                int MassLength = result.Length - MassFrom;

                Array.Copy(result, MassFrom, result, 0, MassLength);
                Array.Resize(ref result, MassLength);
            }

            return(result);
        }
 public byte[] Decode(byte[] mass, GetRsaDelegate getRSA)
 {
     return(mass);
 }