views:

615

answers:

7

I have to encrypt/decrypt some sensitive information in a Xml file? Yes I can do that by writing my own custom algorithms. I am wondering if there is already a built in way in .NET to do that and also what points I always need to take care..

+9  A: 

You will probably want to dive into the System.Security.Cryptography namespace. I guess the articles Cryptography Overview, Encrypting Data and Decrypting Data at MSDN could be good starters.

Fredrik Mörk
+4  A: 

Heres a nice article

Encrypting and Decrypting a C# string

rahul
A: 

See this thread.

liggett78
-1, That thread is about passwords and 1-way hashing.
Henk Holterman
That thread might have "passwords" in its title, but applies to every piece of information you need to encrypt/decrypt. Apart from hashing there are references to DPAPI/TripleDES etc. You're smart enough to understand what scenario you can apply and what is irrelevant, aren't you?
liggett78
+1  A: 

Yes, .NET provides crytography of various forms natively. For your case, you'll need a symmetric one.

Here's a good read.

o.k.w
+10  A: 

Here's a couple of functions that use the .NET framework to encrypt and decrypt a string:

public string EncryptString(string plainText)
{
    // Instantiate a new RijndaelManaged object to perform string symmetric encryption
    RijndaelManaged rijndaelCipher = new RijndaelManaged();

    // Set key and IV
    rijndaelCipher.Key = Convert.FromBase64String("ABC");
    rijndaelCipher.IV = Convert.FromBase64String("123");

    // Instantiate a new MemoryStream object to contain the encrypted bytes
    MemoryStream memoryStream = new MemoryStream();

    // Instantiate a new encryptor from our RijndaelManaged object
    ICryptoTransform rijndaelEncryptor = rijndaelCipher.CreateEncryptor();

    // Instantiate a new CryptoStream object to process the data and write it to the 
    // memory stream
    CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelEncryptor, CryptoStreamMode.Write);

    // Convert the plainText string into a byte array
    byte[] plainBytes = Encoding.ASCII.GetBytes(plainText);

    // Encrypt the input plaintext string
    cryptoStream.Write(plainBytes, 0, plainBytes.Length);

    // Complete the encryption process
    cryptoStream.FlushFinalBlock();

    // Convert the encrypted data from a MemoryStream to a byte array
    byte[] cipherBytes = memoryStream.ToArray();

    // Close both the MemoryStream and the CryptoStream
    memoryStream.Close();
    cryptoStream.Close();

    // Convert the encrypted byte array to a base64 encoded string
    string cipherText = Convert.ToBase64String(cipherBytes, 0, cipherBytes.Length);

    // Return the encrypted data as a string
    return cipherText;
}


public string DecryptString(string cipherText)
{
    // Instantiate a new RijndaelManaged object to perform string symmetric encryption
    RijndaelManaged rijndaelCipher = new RijndaelManaged();

    // Set key and IV
    rijndaelCipher.Key = Convert.FromBase64String("ABC");
    rijndaelCipher.IV = Convert.FromBase64String("123");

    // Instantiate a new MemoryStream object to contain the encrypted bytes
    MemoryStream memoryStream = new MemoryStream();

    // Instantiate a new encryptor from our RijndaelManaged object
    ICryptoTransform rijndaelDecryptor = rijndaelCipher.CreateDecryptor();

    // Instantiate a new CryptoStream object to process the data and write it to the 
    // memory stream
    CryptoStream cryptoStream = new CryptoStream(memoryStream, rijndaelDecryptor, CryptoStreamMode.Write);

    // Will contain decrypted plaintext
    string plainText = String.Empty;

    try
    {
     // Convert the ciphertext string into a byte array
     byte[] cipherBytes = Convert.FromBase64String(cipherText);

     // Decrypt the input ciphertext string
     cryptoStream.Write(cipherBytes, 0, cipherBytes.Length);

     // Complete the decryption process
     cryptoStream.FlushFinalBlock();

     // Convert the decrypted data from a MemoryStream to a byte array
     byte[] plainBytes = memoryStream.ToArray();

     // Convert the encrypted byte array to a base64 encoded string
     plainText = Encoding.ASCII.GetString(plainBytes, 0, plainBytes.Length);
    }
    finally
    {
     // Close both the MemoryStream and the CryptoStream
     memoryStream.Close();
     cryptoStream.Close();
    }

    // Return the encrypted data as a string
    return plainText;
}

Of course I don't advise hardcoding the key and initialisation vector like this :)

Cocowalla
Jeff O
It was only meant to be an illustration, but fair point ;)
Cocowalla
A: 

Here is the link which can tell you about the encryption and decryption ways..Cryptography in .NET

Shivkant
A: 

Find a good library to do it: Encryption is Hard!

Why isn't my encryption encrypting?

A good place to start:

Bouncy Castle

C. Ross