Exemplo n.º 1
0
        public static byte[] RsaPkcs15Sha1_Encrypt(ArraySegment <byte> data, X509Certificate2 cert, SecurityPolicy policy)
        {
            bool useOaep = policy == SecurityPolicy.Basic256;

            var padMethod = UASecurity.PaddingMethodForSecurityPolicy(policy);
            int padSize   = UASecurity.PaddingSizeForMethod(padMethod);

            var rsa             = cert.PublicKey.Key as RSACryptoServiceProvider;
            int inputBlockSize  = GetPlainBlockSize(cert, useOaep);
            int outputBlockSize = rsa.KeySize / 8;

            if (data.Count % inputBlockSize != 0)
            {
                throw new Exception(string.Format("Input data is not a multiple of block size, {0}/{1}", data.Count, inputBlockSize));
            }

            var input = new byte[inputBlockSize];
            var ms    = new MemoryStream();

            for (int i = 0; i < data.Count; i += inputBlockSize)
            {
                Array.Copy(data.Array, data.Offset + i, input, 0, input.Length);
                var encoded = rsa.Encrypt(input, useOaep);
                ms.Write(encoded, 0, encoded.Length);
            }

            ms.Close();
            return(ms.ToArray());
        }
Exemplo n.º 2
0
        public static int CalculateEncryptedSize(
            X509Certificate2 cert,
            int messageSize,
            UASecurity.PaddingAlgorithm paddingAlgorithm)
        {
            if (!(cert.PublicKey.Key is RSA))
            {
                throw new Exception("Could not create RSA");
            }

            int num1 = UASecurity.PaddingSizeForMethod(paddingAlgorithm);
            int num2 = UASecurity.CalculatePublicKeyLength(cert) / 8;

            if (num2 < num1)
            {
                throw new Exception();
            }

            int num3 = num2 - num1;

            return((messageSize + num3 - 1) / num3 * num2);
        }