Witam od tygodnia walczę z implementacją tej funkcji skrótu jest ona elementem mojej pracy inżynierkiej(nie mogę używać wbudowanych). Czy mógłby ktoś podpowiedzieć co trzeba poprawić ,lub dopisać to co brakuję, dzięki z góry:

   void SHA1()
        {
                        List<byte> Data = new List<byte>();
            Data.Add(97);
            Data.Add(97);
            Data.Add(97);
            Data.Add(97);
            Data.Add(97);

            
            
            uint h0 = 0x67452301;
            uint h1 = 0xEFCDAB89;
            uint h2 = 0x98BADCFE;
            uint h3 = 0x10325476;
            uint h4 = 0xC3D2E1F0;

            Data.Add(0x80);
            while (((Data.Count + 8) & 64) == 0)
            {
                Data.Add(0x00);
            }


            UInt64 Lall = (UInt64)Data.Count * 8;

            UInt64[] La = new UInt64[64];
            La[0] = Lall / (72057594037927936);
            Lall = Lall - La[0];
            La[1] = Lall / (281474976710656);
            Lall = Lall - La[1];
            La[2] = Lall / (1099511627776);
            Lall = Lall - La[2];
            La[3] = Lall / (4294967296);
            Lall = Lall - La[3];
            La[4] = Lall / (16777216);
            Lall = Lall - La[4];
            La[5] = Lall / (65536);
            Lall = Lall - La[5];
            La[6] = Lall / (256);
            Lall = Lall - La[6];
            La[7] = Lall;
            Lall = Lall - La[7];

            Data.Add((byte)(((int)La[0])));
            Data.Add((byte)(((int)La[1])));
            Data.Add((byte)(((int)La[2])));
            Data.Add((byte)(((int)La[3])));
            Data.Add((byte)(((int)La[4])));
            Data.Add((byte)(((int)La[5])));
            Data.Add((byte)(((int)La[6])));
            Data.Add((byte)(((int)La[7])));

            byte[] DataBlock = new byte[64];

            uint[] DataWord = new uint[80];

            for (int i = 0; i < 16; i++)
            {
                DataWord[i] = 0;
                DataWord[i] = DataWord[i] + ((uint)Data[i * 4 + 3]) << 24;
                DataWord[i] = DataWord[i] + ((uint)Data[i * 4 + 2]) << 16;
                DataWord[i] = DataWord[i] + ((uint)Data[i * 4 + 1]) << 8;
                DataWord[i] = DataWord[i] + (uint)Data[i * 4];
            }

            for (int i = 16; i < 80; i++)
            {
                DataWord[i] = LeftRotate( (DataWord[i - 3] ^ DataWord[i - 8] ^ DataWord[i - 14] ^ DataWord[i - 16]), 1);
            }


            uint a = h0;
            uint b = h1;
            uint c = h2;
            uint d = h3;
            uint e = h4;
            uint f = 0;
            uint k = 0;
            uint temp = 0;

            for (int i = 0; i < 80; i++)
            {
                if ((0 <= i) & (i <= 19))
                {
                    f = (b & c) | ((~b) & d);
                    k = 0x5A827999;
                }
                if ((20 <= i) & (i <= 39))
                {
                    f = (b ^ c ^ d);
                    k = 0x6ED9EBA1;
                }
                if ((40 <= i) & (i <= 59))
                {
                    f = (b & c) | (b & d) | (c & d);
                    k = 0x8F1BBCDC;
                }
                if ((60 <= i) & (i <= 79))
                {
                    f = b ^ c ^ d;
                    k = 0xCA62C1D6;
                }


                temp = LeftRotate(a, 5) + f + e + k + DataWord[i];
                e = d;
                d = c;
                c = LeftRotate(b, 30);
                b = a;
                a = temp;
            }

            h0 = h0 + a;
            h1 = h1 + b;
            h2 = h2 + c;
            h3 = h3 + d;
            h4 = h4 + e;


        }