AES Decryption using the MachineKey DecryptionKey

Last post 09-02-2008 4:27 PM by tom.hundley. 2 replies.

Sort Posts:

  • AES Decryption using the MachineKey DecryptionKey

    12-04-2007, 11:02 PM
    • Member
      point Member
    • tom.hundley
    • Member since 12-04-2007, 10:35 PM
    • Posts 2

    Hi.  I'm trying to figure out how to use AES encyption and decryption using the DecryptionKey in the MachineKey.  I think I'm on the right track, but I don't know how to get a proper Key and IV from the DecryptionKey to set in my Rijndael manager.

     Here is my web config:

    <machineKey validationKey="3EF4FE4BD3F9A1CA4F293F521B8E3F492ED855FA4029511934BF221FCE80AE6A13252ED080EE6423A69EC96A3AB6E8F6E3A1B90AE70C97CC3C33FD4E51041879" decryption="AES" decryptionKey="D2B115C0460D0DA0F84A4DC2713435A3B4C49C734E1D7E33" validation="AES"/>

    My "Rijndael Manager" is below.  Here is what I'm stuck on right now.  I know this Manager class works great if I create a seperate Key and IV in my webconfig that looks like this (actually those are 256 bit not 128 as the class below shows). 

    <add key="Key" value="JQZqQLLTQ+yV3jfvwPK7PXlJEiKQqDA9bld/ePSyx+E="/>
    <
    add key="IV" value="P1I/4wNHVbpM4/o7DwuCi83YAfOLpBwJyPBVkvRX7vs="/>

    BUT, the problem with this is if I do that, I'm using two different keys for encryption- one for Membership and one with my own Rijnadael manager.  I want to use the same shared DecrytpionKey in the MachineConfig for ALL of my encryption.

    This is what I normally do:

    RijndaelManagedManager cipherManager = new RijndaelManagedManager (Convert.FromBase64String(ConfigurationManager.AppSettings.Get("Key")), Convert.FromBase64String(ConfigurationManager.AppSettings.Get("IV")));

    This is what I WANT to do, using the DecryptKey.  

    RijndaelManagedManager cipherManager = new RijndaelManagedManager();
    cipherManager.IV =
    ??? Get me from the Machine Key Please!
    cipherManager.Key = ??? Get e from the Machine Key Please!

    THANK YOU in advance for any help you can give me.

    --Tom

    ____________________________________________________________________

    using System.Security.Cryptography;

    namespace DOR.Security.Cryptography

    /// <summary>

    /// Manages simple encrypt and decrypt functions using the RijndaelManaged provider

    /// </summary>

    public class RijndaelManagedManager

    {

    RijndaelManaged _cipher = null;

    /// <summary>

    /// Empty constructor

    /// </summary>

    public RijndaelManagedManager()

    {

    _cipher = InitCipher();

    }

    /// <summary>

    /// Pass key and iv to use in operations

    /// </summary>

    /// <param name="key"></param>

    /// <param name="iv"></param>

    public RijndaelManagedManager(byte[] key, byte[] iv)

    {

    _cipher = InitCipher(key, iv);

    }

    /// <summary>

    ///

    /// </summary>

    public byte[] Key

    {

    get { return _cipher.Key; }set { _cipher.Key = value; }

    }

    /// <summary>

    ///

    /// </summary>

    public byte[] IV

    {

    get { return _cipher.IV; }set { _cipher.IV = value; }

    }

    /// <summary>

    /// Encrypt the passed byte array

    /// </summary>

    /// <param name="plainText"></param>

    /// <returns></returns>

    public byte[] Encrypt(byte[] plainText)

    {

    ICryptoTransform transform = _cipher.CreateEncryptor();

    byte[] cipherText = transform.TransformFinalBlock(plainText, 0, plainText.Length);

    return cipherText;

    }

    /// <summary>

    /// Decrypt the passed byte array

    /// </summary>

    /// <param name="cipherText"></param>

    /// <returns></returns>

    public byte[] Decrypt(byte[] cipherText)

    {

    ICryptoTransform transform = _cipher.CreateDecryptor();

    byte[] plainText = transform.TransformFinalBlock(cipherText, 0, cipherText.Length);

    return plainText;

    }

    private RijndaelManaged InitCipher()

    {

    RijndaelManaged cipher = CreateCipher();

    cipher.GenerateKey();

    cipher.GenerateIV();

    return cipher;

    }

    private RijndaelManaged InitCipher(byte[] key, byte[] iv)

    {

    RijndaelManaged cipher = CreateCipher();

    cipher.Key = key;

    cipher.IV = iv;

    return cipher;

    }

    private RijndaelManaged CreateCipher()

    {

    RijndaelManaged cipher = new RijndaelManaged();

    cipher.KeySize = 128;

    cipher.BlockSize = 128;

    cipher.Mode =
    CipherMode.CBC;

    cipher.Padding = PaddingMode.ISO10126;

    return cipher;

    }

    }

    }

  • Re: AES Decryption using the MachineKey DecryptionKey

    01-16-2008, 8:30 AM
    • Member
      6 point Member
    • mdASFARi
    • Member since 01-01-2008, 9:08 AM
    • Posts 5

    Hi Tom,

    use the following property in your class.

    private static MachineKeySection MachineKey
        {
            get
            {
                //Get encryption and decryption key information from the configuration.
                System.Configuration.Configuration cfg = WebConfigurationManager.OpenWebConfiguration(System.Web.Hosting.HostingEnvironment.ApplicationVirtualPath);
                return cfg.GetSection("system.web/machineKey") as MachineKeySection;
            }
        }

    Regards,
    mdASFARi
  • Re: AES Decryption using the MachineKey DecryptionKey

    09-02-2008, 4:27 PM
    • Member
      point Member
    • tom.hundley
    • Member since 12-04-2007, 10:35 PM
    • Posts 2

    Believe it or not, I'm just now getting back around to this. 

    Thanks for the help on the Machine Key Section.  Any insight on how the MachineKeySection.EncrytKey and MachineKeySection.DecyptKey translate into the System.Security.Cryptography.AesManaged.Key and System.Security.Cryptography.AesManaged.IV propery of the System.Security.Cryptography.AesManaged class?

    Thanks,

    Tom

     

Page 1 of 1 (3 items)