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()); }
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); }