Opc.Ua.RsaUtils.Encrypt C# (CSharp) Method

Encrypt() public static method

Encrypts the data using RSA PKCS#1 v1.5 or OAEP encryption.
public static Encrypt ( ArraySegment dataToEncrypt, X509Certificate2 encryptingCertificate, bool useOaep, ArraySegment outputBuffer ) : ArraySegment
dataToEncrypt ArraySegment
encryptingCertificate System.Security.Cryptography.X509Certificates.X509Certificate2
useOaep bool
outputBuffer ArraySegment
return ArraySegment
        public static ArraySegment<byte> Encrypt(
            ArraySegment<byte> dataToEncrypt,
            X509Certificate2 encryptingCertificate,
            bool useOaep,
            ArraySegment<byte> outputBuffer)
        {
            // get the encrypting key.
            using (RSA rsa = encryptingCertificate.GetRSAPublicKey())
            {

                if (rsa == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadSecurityChecksFailed, "No public key for certificate.");
                }

                int inputBlockSize = GetPlainTextBlockSize(encryptingCertificate, useOaep);
                int outputBlockSize = rsa.KeySize / 8;

                // verify the input data is the correct block size.
                if (dataToEncrypt.Count % inputBlockSize != 0)
                {
                    Utils.Trace("Message is not an integral multiple of the block size. Length = {0}, BlockSize = {1}.", dataToEncrypt.Count, inputBlockSize);
                }

                byte[] encryptedBuffer = outputBuffer.Array;

                using (MemoryStream ostrm = new MemoryStream(
                    encryptedBuffer,
                    outputBuffer.Offset,
                    outputBuffer.Count))
                {

                    // encrypt body.
                    byte[] input = new byte[inputBlockSize];

                    for (int ii = dataToEncrypt.Offset; ii < dataToEncrypt.Offset + dataToEncrypt.Count; ii += inputBlockSize)
                    {
                        Array.Copy(dataToEncrypt.Array, ii, input, 0, input.Length);
                        if (useOaep == true)
                        {
                            byte[] cipherText = rsa.Encrypt(input, RSAEncryptionPadding.OaepSHA1);
                            ostrm.Write(cipherText, 0, cipherText.Length);
                        }
                        else
                        {
                            byte[] cipherText = rsa.Encrypt(input, RSAEncryptionPadding.Pkcs1);
                            ostrm.Write(cipherText, 0, cipherText.Length);
                        }
                    }
                }

                // return buffer
                return new ArraySegment<byte>(
                    encryptedBuffer,
                    outputBuffer.Offset,
                    (dataToEncrypt.Count / inputBlockSize) * outputBlockSize);
            }
        }

Same methods

RsaUtils::Encrypt ( byte dataToEncrypt, X509Certificate2 encryptingCertificate, bool useOaep ) : byte[]

Usage Example

コード例 #1
0
        /// <summary>
        /// Encrypts the text using the SecurityPolicyUri and returns the result.
        /// </summary>
        public static EncryptedData Encrypt(X509Certificate2 certificate, string securityPolicyUri, byte[] plainText)
        {
            EncryptedData encryptedData = new EncryptedData();

            encryptedData.Algorithm = null;
            encryptedData.Data      = plainText;

            // check if nothing to do.
            if (plainText == null)
            {
                return(encryptedData);
            }

            // nothing more to do if no encryption.
            if (String.IsNullOrEmpty(securityPolicyUri))
            {
                return(encryptedData);
            }

            // encrypt data.
            switch (securityPolicyUri)
            {
            case SecurityPolicies.Basic256:
            case SecurityPolicies.Basic256Sha256:
            {
                encryptedData.Algorithm = SecurityAlgorithms.RsaOaep;
                encryptedData.Data      = RsaUtils.Encrypt(plainText, certificate, true);
                break;
            }

            case SecurityPolicies.Basic128Rsa15:
            {
                encryptedData.Algorithm = SecurityAlgorithms.Rsa15;
                encryptedData.Data      = RsaUtils.Encrypt(plainText, certificate, false);
                break;
            }

            case SecurityPolicies.None:
            {
                break;
            }

            default:
            {
                throw ServiceResultException.Create(
                          StatusCodes.BadSecurityPolicyRejected,
                          "Unsupported security policy: {0}",
                          securityPolicyUri);
            }
            }

            return(encryptedData);
        }