2009-10-27 15 views
13

Devo crittografare/decifrare alcune informazioni sensibili in un file Xml? Sì, posso farlo scrivendo i miei algoritmi personalizzati. Mi chiedo se c'è già un modo integrato in .NET per farlo e anche quali punti ho sempre bisogno di fare attenzione ..Come crittografare una stringa in .NET?

risposta

24

Ecco un paio di funzioni che utilizzano il framework .NET di cifrare e decifrare una stringa:

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; 
} 

Naturalmente io non consiglio hardcoding la chiave e vettore di inizializzazione come questo :)

+2

" ABC "&" 123 "sono lunghezze non valide per un array di basi Base-64. – JeffO

+1

Era solo un'illustrazione, ma un punto giusto;) – Cocowalla

+0

Solo per aggiungere valore per gli altri visitatori qui - la lunghezza di entrambe le chiavi e IV può essere di 24 caratteri. Ad esempio: "keJhDo9YvJsp01j4JUdVuE ==" –

Problemi correlati