This documentation is archived and is not being maintained.

RSAOAEPKeyExchangeDeformatter Class

Decrypts Optimal Asymmetric Encryption Padding (OAEP) key exchange data.

Namespace: System.Security.Cryptography
Assembly: mscorlib (in mscorlib.dll)

'Declaration
<ComVisibleAttribute(True)> _
Public Class RSAOAEPKeyExchangeDeformatter
	Inherits AsymmetricKeyExchangeDeformatter
'Usage
Dim instance As RSAOAEPKeyExchangeDeformatter

/** @attribute ComVisibleAttribute(true) */ 
public class RSAOAEPKeyExchangeDeformatter extends AsymmetricKeyExchangeDeformatter
ComVisibleAttribute(true) 
public class RSAOAEPKeyExchangeDeformatter extends AsymmetricKeyExchangeDeformatter
Not applicable.

Key exchange allows a sender to create secret information, for example, random data that can be used as a key in a symmetric encryption algorithm, and use encryption to send it to the intended recipient.

Use RSAOAEPKeyExchangeFormatter to create the key exchange message with the RSA algorithm.

Caution noteCaution:

It is highly recommended that you not attempt to create your own key exchange method from the basic functionality provided, because many details of the operation must be performed carefully in order for the key exchange to be successful.

The following code example demonstrates how to use members of the RSAOAEPKeyExchangeDeformatter class.

Imports System
Imports System.Security.Cryptography
Imports System.Text

Public Class Form1
    Inherits System.Windows.Forms.Form

    ' Use a member variable to hold the RSA key for encoding and decoding.
    Private rsaKey As RSA

    ' Event handler for Run button.
    Private Sub Button1_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

        tbxOutput.Cursor = Cursors.WaitCursor
        tbxOutput.Text = ""

        Dim message As String = "A phrase to be encoded."

        InitializeKey(RSA.Create())

        WriteLine("Encoding the following message:")
        WriteLine(message)
        Dim encodedMessage() As Byte = EncodeMessage(message)
        WriteLine("Resulting message encoded:")
        WriteLine(Encoding.ASCII.GetString(encodedMessage))

        Dim decodedMessage As String = DecodeMessage(encodedMessage)
        WriteLine("Resulting message decoded:")
        WriteLine(decodedMessage)

        ' Construct a formatter to demonstrate how to set each property.
        ConstructFormatter()

        ' Construct a deformatter to demonstrate how to set each property.
        ConstructDeformatter()

        ' Align interface and conclude application.
        tbxOutput.AppendText(vbCrLf + "This sample completed " + _
            "successfully; press Exit to continue.")

        ' Reset the cursor.
        tbxOutput.Cursor = Cursors.Default
    End Sub
    ' Initialize an rsaKey member variable with the specified RSA key.
    private sub InitializeKey(byval key as RSA)
        rsaKey = key
    End Sub
    ' Use the RSAOAEPKeyExchangeDeformatter class to decode the 
    ' specified message.
    Private Function EncodeMessage(ByVal message As String) As Byte()
        Dim encodedMessage() As Byte = Nothing

        Try
            ' Construct a formatter with the specified RSA key.
            Dim keyEncryptor As New RSAOAEPKeyExchangeFormatter(rsaKey)

            ' Convert the message to bytes to create the encrypted data.
            Dim byteMessage() As Byte
            byteMessage = Encoding.ASCII.GetBytes(message)
            encodedMessage = keyEncryptor.CreateKeyExchange(byteMessage)

        Catch ex As Exception
            WriteLine("Unexpected exception caught:" + ex.ToString())
        End Try

        Return encodedMessage

    End Function
    ' Use the RSAOAEPKeyExchangeDeformatter class to decode the
    ' specified message.
    Private Function DecodeMessage(ByVal encodedMessage() As Byte) As String
        Dim decodedMessage As String = Nothing

        Try
            ' Construct a deformatter with the specified RSA key.
            Dim keyDecryptor As New RSAOAEPKeyExchangeDeformatter(rsaKey)

            ' Decrypt the encoded message.
            Dim decodedBytes() As Byte
            decodedBytes = keyDecryptor.DecryptKeyExchange(encodedMessage)

            ' Retrieve a string representation of the decoded message.
            decodedMessage = Encoding.ASCII.GetString(decodedBytes)
        Catch ex As Exception
            WriteLine("Unexpected exception caught:" + ex.ToString())
        End Try

        Return decodedMessage

    End Function
    ' Create an RSAOAEPKeyExchangeFormatter object with a new RSA key.
    ' Display its properties to the console.
    Private Sub ConstructFormatter()
        ' Construct an empty Optimal Asymmetric Encryption Padding (OAEP)
        ' key exchange.
        Dim rsaFormatter = New RSAOAEPKeyExchangeFormatter

        ' Create an RSA and set it into the specified 
        ' RSAOAEPKeyExchangeFormatter.
        Dim key As RSA = RSA.Create()
        rsaFormatter.SetKey(key)

        ' Create a random number using the RNGCryptoServiceProvider provider.
        Dim ring As New RNGCryptoServiceProvider
        rsaFormatter.Rng = ring

        ' Export InverseQ and set it into RSAOAEPKeyExchangeFormatter.
        rsaFormatter.Parameter = key.ExportParameters(True).InverseQ

        WriteLine(vbCrLf + "**" + rsaFormatter.ToString() + "**")
        WriteLine("The following random number was generated for the class:")
        WriteLine(rsaFormatter.Rng.ToString())

        WriteLine(vbCrLf + "The RSA formatter contains the following " + _
            "InverseQ parameter:")
        WriteLine(Encoding.ASCII.GetString(rsaFormatter.Parameter))

        Dim xmlParameters as string = rsaFormatter.Parameters

        WriteLine(vbCrLf + "The RSA formatter has the following parameters:")
        WriteLine(xmlParameters )
    End Sub

    ' Create an RSAOAEPKeyExchangeDeformatter object with a new RSA key.
    ' Display its properties to the console.
    Private Sub ConstructDeformatter()
        ' Construct an empty OAEP key exchange.
        Dim rsaDeformatter As New RSAOAEPKeyExchangeDeformatter

        ' Create an RSAKey and set it into the specified 
        ' RSAOAEPKeyExchangeDeformatter.
        Dim key As RSA = RSA.Create()
        rsaDeformatter.SetKey(key)

        Dim xmlParameters as string = rsaDeformatter.Parameters

        WriteLine(vbCrLf + "**" + rsaDeformatter.ToString() + "**")
        WriteLine(vbCrLf + "The RSA deformatter has the following ")
        WriteLine("parameters:" + xmlParameters)
    End Sub
    ' Write message with carriage return to output textbox.
    Private Sub WriteLine(ByVal message As String)
        tbxOutput.AppendText(message + vbCrLf)
    End Sub
    ' Event handler for Exit button.
    Private Sub Button2_Click( _
        ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button2.Click

        Application.Exit()
    End Sub
#Region " Windows Form Designer generated code "

    Public Sub New()
        MyBase.New()

        'This call is required by the Windows Form Designer.
        InitializeComponent()

        'Add any initialization after the InitializeComponent() call

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Required by the Windows Form Designer
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer
    'It can be modified using the Windows Form Designer.  
    'Do not modify it using the code editor.
    Friend WithEvents Panel2 As System.Windows.Forms.Panel
    Friend WithEvents Panel1 As System.Windows.Forms.Panel
    Friend WithEvents Button1 As System.Windows.Forms.Button
    Friend WithEvents Button2 As System.Windows.Forms.Button
    Friend WithEvents tbxOutput As System.Windows.Forms.RichTextBox
    <System.Diagnostics.DebuggerStepThrough()> _
    Private Sub InitializeComponent()
        Me.Panel2 = New System.Windows.Forms.Panel
        Me.Button1 = New System.Windows.Forms.Button
        Me.Button2 = New System.Windows.Forms.Button
        Me.Panel1 = New System.Windows.Forms.Panel
        Me.tbxOutput = New System.Windows.Forms.RichTextBox
        Me.Panel2.SuspendLayout()
        Me.Panel1.SuspendLayout()
        Me.SuspendLayout()
        '
        'Panel2
        '
        Me.Panel2.Controls.Add(Me.Button1)
        Me.Panel2.Controls.Add(Me.Button2)
        Me.Panel2.Dock = System.Windows.Forms.DockStyle.Bottom
        Me.Panel2.DockPadding.All = 20
        Me.Panel2.Location = New System.Drawing.Point(0, 320)
        Me.Panel2.Name = "Panel2"
        Me.Panel2.Size = New System.Drawing.Size(616, 64)
        Me.Panel2.TabIndex = 1
        '
        'Button1
        '
        Me.Button1.Dock = System.Windows.Forms.DockStyle.Right
        Me.Button1.Font = New System.Drawing.Font("Microsoft Sans Serif", _
            9.0!, _
            System.Drawing.FontStyle.Regular, _
            System.Drawing.GraphicsUnit.Point, _
            CType(0, Byte))
        Me.Button1.Location = New System.Drawing.Point(446, 20)
        Me.Button1.Name = "Button1"
        Me.Button1.Size = New System.Drawing.Size(75, 24)
        Me.Button1.TabIndex = 2
        Me.Button1.Text = "&Run"
        '
        'Button2
        '
        Me.Button2.Dock = System.Windows.Forms.DockStyle.Right
        Me.Button2.Font = New System.Drawing.Font( _
            "Microsoft Sans Serif", 9.0!, _
            System.Drawing.FontStyle.Regular, _
            System.Drawing.GraphicsUnit.Point, _
            CType(0, Byte))
        Me.Button2.Location = New System.Drawing.Point(521, 20)
        Me.Button2.Name = "Button2"
        Me.Button2.Size = New System.Drawing.Size(75, 24)
        Me.Button2.TabIndex = 3
        Me.Button2.Text = "E&xit"
        '
        'Panel1
        '
        Me.Panel1.Controls.Add(Me.tbxOutput)
        Me.Panel1.Dock = System.Windows.Forms.DockStyle.Fill
        Me.Panel1.DockPadding.All = 20
        Me.Panel1.Location = New System.Drawing.Point(0, 0)
        Me.Panel1.Name = "Panel1"
        Me.Panel1.Size = New System.Drawing.Size(616, 320)
        Me.Panel1.TabIndex = 2
        '
        'tbxOutput
        '
        Me.tbxOutput.AccessibleDescription = _
            "Displays output from application."
        Me.tbxOutput.AccessibleName = "Output textbox."
        Me.tbxOutput.Dock = System.Windows.Forms.DockStyle.Fill
        Me.tbxOutput.Location = New System.Drawing.Point(20, 20)
        Me.tbxOutput.Name = "tbxOutput"
        Me.tbxOutput.Size = New System.Drawing.Size(576, 280)
        Me.tbxOutput.TabIndex = 1
        Me.tbxOutput.Text = "Click the Run button to run the application."
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 15)
        Me.ClientSize = New System.Drawing.Size(616, 384)
        Me.Controls.Add(Me.Panel1)
        Me.Controls.Add(Me.Panel2)
        Me.Name = "Form1"
        Me.Text = "RSAOAEPKeyExchangeFormatter"
        Me.Panel2.ResumeLayout(False)
        Me.Panel1.ResumeLayout(False)
        Me.ResumeLayout(False)

    End Sub

#End Region
End Class
'
' This sample produces the following output:
'
' Encoding the following message:
' A phrase to be encoded.
' Resulting message encoded:k90)DU890fus8d9u*D_(8
' Resulting message decoded:
' A phrase to be encoded.
' 
' **System.Security.Cryptography.RSAOAEPKeyExchangeFormatter**
' The following random number was generated for the class:
' System.Security.Cryptography.RNGCryptoServiceProvider
' 
' The RSA formatter contains the following InverseQ parameter:
' J*Df89uDZ*(*F09
' The RSA formatter has the following parameters:
' 
' 
' **System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter**
' 
' The RSA deformatter has the following 
' parameters:
' 
' This sample completed successfully; press Exit to continue.

import System.*;
import System.Security.Cryptography.*;
import System.Text.*;

class RSAEncoder
{
    // Use a member variable to hold the RSA key for encoding and decoding.
    private RSA rsaKey;

    /** @attribute STAThread()
     */
    public static void main(String[] args)
    {
        String message = "A phrase to be encoded.";
        RSAEncoder rsaEncoder = new RSAEncoder();
        rsaEncoder.InitializeKey(RSA.Create());
        Console.WriteLine("Encoding the following message:");
        Console.WriteLine(message);
        ubyte encodedMessage[] = rsaEncoder.EncodeMessage(message);
        Console.WriteLine("Resulting message encoded:");
        Console.WriteLine(Encoding.get_ASCII().GetString(encodedMessage));
        String decodedMessage = rsaEncoder.DecodeMessage(encodedMessage);
        Console.WriteLine("Resulting message decoded:");
        Console.WriteLine(decodedMessage);
        // Construct a formatter to demonstrate how to set each property.
        rsaEncoder.ConstructFormatter();
        // Construct a deformatter to demonstrate how to set each property.
        rsaEncoder.ConstructDeformatter();

        Console.WriteLine("This sample completed successfully, " 
            + " press enter to continue.");
        Console.ReadLine();
    } //main

    // Initialize an rsaKey member variable with the specified RSA key.
    private void InitializeKey(RSA key)
    {
        rsaKey = key;
    } //InitializeKey

    // Use the RSAOAEPKeyExchangeDeformatter class to decode the 
    // specified message.
    private ubyte[] EncodeMessage(String message)
    {
        ubyte encodedMessage[] = null;
        try {
            // Construct a formatter with the specified RSA key.
            RSAOAEPKeyExchangeFormatter keyEncryptor 
                = new RSAOAEPKeyExchangeFormatter(rsaKey);

            // Convert the message to bytes to create the encrypted data.
            ubyte byteMessage[] = Encoding.get_ASCII().GetBytes(message);
            encodedMessage = keyEncryptor.CreateKeyExchange(byteMessage);
        } 
        catch (System.Exception ex) {
            Console.WriteLine("Unexpected exception caught:" + ex.ToString());
        }
        return encodedMessage;
    } //EncodeMessage

    // Use the RSAOAEPKeyExchangeDeformatter class to decode the
    // specified message.
    private String DecodeMessage(ubyte encodedMessage[])
    {
        String decodedMessage = null;
        try {
            // Construct a deformatter with the specified RSA key.
            RSAOAEPKeyExchangeDeformatter keyDecryptor 
                = new RSAOAEPKeyExchangeDeformatter(rsaKey);

            // Decrypt the encoded message.
            ubyte decodedBytes[] = keyDecryptor.
                DecryptKeyExchange(encodedMessage);

            // Retrieve a string representation of the decoded message.
            decodedMessage = Encoding.get_ASCII().GetString(decodedBytes);
        }
        catch (System.Exception ex) {
            Console.WriteLine("Unexpected exception caught:" + ex.ToString());
        }
        return decodedMessage;
    } //DecodeMessage

    // Create an RSAOAEPKeyExchangeFormatter object with a new RSA key.
    // Display its properties to the console.
    private void ConstructFormatter()
    {
        // Construct an empty Optimal Asymmetric Encryption Padding (OAEP)
        // key exchange.
        RSAOAEPKeyExchangeFormatter rsaFormatter 
            = new RSAOAEPKeyExchangeFormatter();

        // Create an RSA and set it into the specified 
        // RSAOAEPKeyExchangeFormatter.
        RSA key = RSA.Create();
        rsaFormatter.SetKey(key);

        // Create a random number using the RNGCryptoServiceProvider provider.
        RNGCryptoServiceProvider ring = new RNGCryptoServiceProvider();
        rsaFormatter.set_Rng(ring);

        // Export InverseQ and set it into the RSAOAEPKeyExchangeFormatter.
        rsaFormatter.set_Parameter(key.ExportParameters(true).InverseQ);

        Console.WriteLine();
        Console.WriteLine("**" + rsaFormatter.ToString() + "**");
        Console.Write("The following random number was generated using the ");
        Console.WriteLine("class:");
        Console.WriteLine(rsaFormatter.get_Rng());

        Console.WriteLine();
        Console.Write("The RSA formatter contains the following InverseQ");
        Console.WriteLine(" parameter:");
        Console.WriteLine(Encoding.get_ASCII().GetString(rsaFormatter.
            get_Parameter()));

        Console.WriteLine();
        String xmlParameters = rsaFormatter.get_Parameters();

        Console.WriteLine("The RSA formatter has the following parameters:");
        Console.WriteLine(xmlParameters);
    } //ConstructFormatter

    // Create an RSAOAEPKeyExchangeDeformatter object with a new RSA key.
    // Display its properties to the console.
    private void ConstructDeformatter()
    {
        // Construct an empty OAEP key exchange.
        RSAOAEPKeyExchangeDeformatter rsaDeformatter 
            = new RSAOAEPKeyExchangeDeformatter();
        // Create an RSAKey and set it into the specified 
        // RSAOAEPKeyExchangeFormatter.
        RSA key = RSA.Create();
        rsaDeformatter.SetKey(key);
        Console.WriteLine();
        Console.WriteLine("**" + rsaDeformatter.ToString() + "**");
        String xmlParameters = rsaDeformatter.get_Parameters();
        Console.WriteLine();
        Console.WriteLine("The RSA deformatter has the following ");
        Console.WriteLine("parameters:" + xmlParameters);
    } //ConstructDeformatter
} //RSAEncoder
//
// This sample produces the following output:
//
// Encoding the following message:
// A phrase to be encoded.
// Resulting message encoded: %?}T:v??xu?eD)YucItjwuALH HB,Uj??2xq?.?s45
// ?f?L2?=X?CPzWx???"q5?6&N"AE,Z+T?(]S?_7~,?G{?VV!:S?df?
// Resulting message decoded:
// A phrase to be encoded.
//
// **System.Security.Cryptography.RSAOAEPKeyExchangeFormatter**
// The following random number was generated using the class:
// System.Security.Cryptography.RNGCryptoServiceProvider
//
// The RSA formatter contains the following InverseQ parameter:
// 3MM??]D#?mBq_;:ws^1?ko??,_ ??A[hyWcP$?`v.>@?^!dU%\?H0N'??Ca?Ns
//
// The RSA formatter has the following parameters:
//
//
// **System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter**
//
// The RSA deformatter has the following
// parameters:
// This sample completed successfully,  press enter to continue.

System.Object
   System.Security.Cryptography.AsymmetricKeyExchangeDeformatter
    System.Security.Cryptography.RSAOAEPKeyExchangeDeformatter

Any public static (Shared in Visual Basic) members of this type are thread safe. Any instance members are not guaranteed to be thread safe.

Windows 98, Windows Server 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The Microsoft .NET Framework 3.0 is supported on Windows Vista, Microsoft Windows XP SP2, and Windows Server 2003 SP1.

.NET Framework

Supported in: 3.0, 2.0, 1.1, 1.0
Show: