예제 #1
0
        private byte[] OAEPDecrypt(byte[] cipher)
        {
            var modLen = rsaParameters.Modulus.GetByteCount();

            var msize = modLen - HashOutputSize - 1;

            var X = new byte[msize];
            var Y = new byte[HashOutputSize];

            Array.Copy(cipher, 0, X, 0, msize);
            Array.Copy(cipher, msize, Y, 0, Y.Length);

            using var sha256 = new SHA256C();
            var r = XorArray(Y, sha256.ComputeHash(X));

            sha256.Initialize();
            var m = XorArray(X, sha256.ComputeHash(r));

            var i = m.Length - 1;

            while (m[i] == 0)
            {
                --i;
            }

            return(m.Take(i + 1).ToArray());
        }
예제 #2
0
        private byte[] OAEPEncrypt(byte[] message)
        {
            var modLen = rsaParameters.Modulus.GetByteCount();

            byte[] r = new byte[HashOutputSize];
            RandomNumberGenerator.Fill(r);

            var msize = modLen - r.Length - 1;
            var m     = new byte[msize];

            m.Initialize();
            Array.Copy(message, m, message.Length);

            using var sha256 = new SHA256C();
            var X = XorArray(m, sha256.ComputeHash(r));

            sha256.Initialize();
            var Y = XorArray(r, sha256.ComputeHash(X));

            return(X.Concat(Y).ToArray());
        }