Esempio n. 1
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);
        }
Esempio n. 2
0
        /// <summary>Шифровать массив</summary>
        /// <param name="mass">Массив для шифрования</param>
        public unsafe byte[] Encode(byte[] mass, RSACryptoServiceProvider rsa)
        {
            var result = mass.Clone() as byte[];

            var rnd = new Random();

            var mrpass  = new crypt_struct(rnd, result.Length / 2); //внутренний пароль смещения
            var urbytes = new crypt_struct(rnd, 200, 200);          //внешний пароль смещения

            var passPos = result.Length;
            int enckeyLength;

            {
                var enckey = rsa.Encrypt(urbytes.mass, true); //шифрованый шифр

                enckeyLength = enckey.Length;                 //длина шифрованного пароля

                //новая длина, с учетом длины паролей
                Array.Resize(ref result, result.Length + mrpass.mass.Length + enckey.Length + 8);   //+8 - длина внешнего пароля 4(позиция 0) + длина внутреннего пароля(позиция 4)

                //сдвигаю на указатели длин паролей и длины внутреннего + внешнего паролей. id автора не шифруется
                Array.Copy(result, 0, result, 8 + enckey.Length + mrpass.mass.Length, passPos);

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

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

                //копирую внешний пароль
                Array.Copy(enckey, 0, result, 8, enckey.Length);
                //копирую внутренний пароль
                Array.Copy(mrpass.mass, 0, result, enckey.Length + 8, mrpass.mass.Length);
            }

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

                for (int i = Start; i < End; i++)
                {
                    result[i] = mrpass.Encrypt(result[i]);
                }
            }
            //шифрую данные и первый пароль вторым шифром(иначе - все, кроме указателя длины внешнего пароля и id пользователя)
            {
                int Start = 8 + enckeyLength;
                int End   = result.Length - 4;

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

            return(result);
        }