示例#1
0
    public string Encrypt(string message)
    {
        var bitList = new BitList(new BitArray(Encoding.UTF8.GetBytes(message)));

        if (bitList.Count > 256)
        {
            throw new SHA_256_Exception("Message must be equal or less then 256 bit");
        }

        bitList.ListOfBits.Add(true); //Added one bit

        if (bitList.Count < 448)      //Added (L + 1 + K) mod 512 zero bits
        {
            bitList.AddBits(448 - bitList.Count);
        }

        BitList.Concate(bitList.ListOfBits, new BitList(new BitArray(message.Length), 64).ListOfBits); //Added 64 bit word length

        var blocks32 = BitList.Split(bitList, 32);

        for (int i = 16; i < 63; i++)
        {
            var s0 = (BitList.RotRight(blocks32[i - 15].ListOfBits, 7)) ^ (BitList.RotRight(blocks32[i - 15].ListOfBits, 18)) ^ (BitList.LogicRight(blocks32[i - 15], 3));
            var s1 = (BitList.RotRight(blocks32[i - 2].ListOfBits, 17)) ^ (BitList.RotRight(blocks32[i - 2].ListOfBits, 19)) ^ (BitList.LogicRight(blocks32[i - 2], 10));
            blocks32.Add((blocks32[i - 16] + s0) + (blocks32[i - 7] + s1));
        }

        var a = H[0];
        var b = H[1];
        var c = H[2];
        var d = H[3];
        var e = H[4];
        var f = H[5];
        var g = H[6];
        var h = H[7];

        for (int i = 0; i < 63; i++)
        {
            var sum0 = (a >> 2) ^ (a >> 13) ^ (a >> 22);
            var Ma   = (a & b) ^ (a & c) ^ (b & c);
            var t2   = sum0 + Ma;
            var sum1 = (e >> 6) ^ (e >> 11) ^ (e >> 25);
            var Ch   = (e & f) ^ ((~e) & g);
            var t1   = h + sum1 + Ch + blocks32[i] + K[i];

            h = g;
            g = f;
            f = e;
            e = t1 + d;
            d = c;
            c = b;
            b = a;
            a = t1 + t2;
        }

        H[0] += a;
        H[1] += b;
        H[2] += c;
        H[3] += d;
        H[4] += e;
        H[5] += f;
        H[6] += g;
        H[7] += h;

        return($"{H[0]} {H[1]} {H[2]} {H[3]} {H[4]} {H[5]} {H[6]} {H[7]}");
    }