Criptare e decriptare stringhe utilizzando l'algoritmo di Rijndael

di Emanuele DelBono, in UserScript, ASP.NET, Security,

Spesso durante lo sviluppo delle nostre applicazioni ci troviamo a doverci scontrare con problemi legati alla sicurezza.
Uno su tutti è la necessità di dover nascondere in qualche modo le informazioni sensibili.
Il .NET Framework mette a disposizione una serie di classi dedicate alla crittazione dei dati. Di seguito riportiamo una classe che permette di criptare e decriptare una stringa utilizzando l'algoritmo di Rijndael a chiave simmetrica:

using System;
using System.Security.Cryptography;
using System.Text;
using System.IO;

public class DataCrypter
{
  private static byte[] keyb;
  private static byte[] ivb = {10,61,25,12,122,120,80,248,
                                       13,182,196,212,176,46,23,85};

  // la chiave è nel web.config
  public static String keyFile = System.Configuration.ConfigurationSettings.AppSettings["KeyFile"];

  private static byte[] LoadKey()
  {
    Byte[] key = new Byte[32];
    StreamReader sr;
    sr = File.OpenText(keyFile);
    for (int i=0;i<32;i++)
    {
      String str = sr.ReadLine();
      key<i> = Byte.Parse(str);
    }
    return key;
  }

  // cripta la stringa
  public static string EncryptString(string src)
  {
    keyb = LoadKey();

    byte[] p = Encoding.ASCII.GetBytes(src.ToCharArray());
    byte[] encodedBytes = {};

    MemoryStream ms = new MemoryStream();
    RijndaelManaged rv = new RijndaelManaged();
    CryptoStream cs = new CryptoStream(ms, rv.CreateEncryptor(keyb,ivb), CryptoStreamMode.Write);
         
    try
    {
      cs.Write(p, 0, p.Length);
      cs.FlushFinalBlock();
      encodedBytes = ms.ToArray();
    }
    finally
    {
      ms.Close();
      cs.Close();
    }

    return Convert.ToBase64String(encodedBytes);
  }

  // descripta
  public static string DecryptString(string src)
  {
    if (src != String.Empty)
    {
      keyb = LoadKey();

      byte[] p = Convert.FromBase64String(src);
      byte[] initialText = new Byte[p.Length];

      RijndaelManaged rv = new RijndaelManaged();
      MemoryStream ms = new MemoryStream(p);
      CryptoStream cs = new CryptoStream(ms, rv.CreateDecryptor(keyb, ivb), CryptoStreamMode.Read);

      try 
      {
        cs.Read(initialText, 0,  initialText.Length);
      }
      finally 
      {
        ms.Close();
        cs.Close();
      }

      StringBuilder sb = new StringBuilder();
      
      for(int i=0;i < initialText.Length;++i)
      {
        sb.Append((char)initialText<i>);
      }
      return sb.ToString();
    }
    return src;
  }

  public DataCrypter()
  {}
}

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi