[C#] Chiffrement et déchiffrement d'une chaîne en C #


Answers

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

public static class EncryptionHelper
{
    public static string Encrypt(string clearText)
    {
        string EncryptionKey = "abc123";
        byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(clearBytes, 0, clearBytes.Length);
                    cs.Close();
                }
                clearText = Convert.ToBase64String(ms.ToArray());
            }
        }
        return clearText;
    }
    public static string Decrypt(string cipherText)
    {
        string EncryptionKey = "abc123";
        cipherText = cipherText.Replace(" ", "+");
        byte[] cipherBytes = Convert.FromBase64String(cipherText);
        using (Aes encryptor = Aes.Create())
        {
            Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
            encryptor.Key = pdb.GetBytes(32);
            encryptor.IV = pdb.GetBytes(16);
            using (MemoryStream ms = new MemoryStream())
            {
                using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    cs.Write(cipherBytes, 0, cipherBytes.Length);
                    cs.Close();
                }
                cipherText = Encoding.Unicode.GetString(ms.ToArray());
            }
        }
        return cipherText;
    }
}
Question

Cette question a déjà une réponse ici:

Quelle est la manière la plus moderne (la meilleure) de satisfaire ce qui suit en C #?

string encryptedString = SomeStaticClass.Encrypt(sourceString);

string decryptedString = SomeStaticClass.Decrypt(encryptedString);

MAIS avec un minimum de tracas impliquant des sels, des clés, le déblayage avec des octets [], etc.

Été googling et confus à ce que je trouve (vous pouvez voir la liste de SO similaires QS pour voir c'est une question trompeuse à poser).




Si vous ciblez ASP.NET Core qui ne prend pas encore en charge RijndaelManaged , vous pouvez utiliser IDataProtectionProvider .

Commencez par configurer votre application pour utiliser la protection des données:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDataProtection();
    }
    // ...
}

Ensuite, vous serez en mesure d'injecter l'instance IDataProtectionProvider et de l'utiliser pour crypter / décrypter des données:

public class MyService : IService
{
    private const string Purpose = "my protection purpose";
    private readonly IDataProtectionProvider _provider;

    public MyService(IDataProtectionProvider provider)
    {
        _provider = provider;
    }

    public string Encrypt(string plainText)
    {
        var protector = _provider.CreateProtector(Purpose);
        return protector.Protect(plainText);
    }

    public string Decrypt(string cipherText)
    {
        var protector = _provider.CreateProtector(Purpose);
        return protector.Unprotect(cipherText);
    }
}

Voir cet article pour plus de détails.




Si vous avez besoin de stocker un mot de passe en mémoire et que vous souhaitez le crypter, vous devez utiliser SecureString :

http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx

Pour des utilisations plus générales, j'utiliserais un algorithme approuvé par FIPS tel que Advanced Encryption Standard, anciennement connu sous le nom de Rijndael. Voir cette page pour un exemple de mise en œuvre:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndael.aspx