Egyszerű titkosítás C#-ban a String osztály kibővítésével

RoliSoft
2010 May 24, Monday 23:57

A titkosítás egy nehéz feladat tud lenni kezdőknek és haladóknak is egyaránt. Velem is többször előfordult, hogy C#-ban valamit titkosítani kelletett, éppen ezért írtam egy kis osztályt ami kihasználja az osztályok bővíthetőségét és beszúrja az Encrypt() meg Decrypt() függvényeket a System.String osztályba. Így bármilyen stringre meg lehet majd őket hívni.

A függvények a .Net Framework beépített AES 256 bites algoritmust használják CBC módban és PBKDF2-t jelszó generáláshoz.

public static class EncryptionExtensions
{
    public static string Encrypt(this string secret, string password)
    {
        var raw = Encoding.UTF8.GetBytes(secret);

        var pdb = new Rfc2898DeriveBytes(password,
                                         new byte[]
                                             {
                                                 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
                                                 0x72, 0x6f, 0x6c, 0x69, 0x73, 0x6f, 0x66, 0x74, 0x2e,
                                                 0x6e, 0x65, 0x74, 0x2f, 0x20, 0x3b, 0x29, 0x20, 0x20
                                             });

        var ms = new MemoryStream();

        var alg = Rijndael.Create();
        alg.Mode = CipherMode.CBC;
        alg.Key = pdb.GetBytes(32);
        alg.IV = pdb.GetBytes(16);

        var cs = new CryptoStream(ms, alg.CreateEncryptor(), CryptoStreamMode.Write);
        cs.Write(raw, 0, raw.Length);
        cs.Close();

        return Convert.ToBase64String(ms.ToArray());
    }

    public static string Decrypt(this string secret, string password)
    {
        var enc = Convert.FromBase64String(secret);

        var pdb = new Rfc2898DeriveBytes(password,
                                         new byte[]
                                             {
                                                 0x20, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
                                                 0x72, 0x6f, 0x6c, 0x69, 0x73, 0x6f, 0x66, 0x74, 0x2e,
                                                 0x6e, 0x65, 0x74, 0x2f, 0x20, 0x3b, 0x29, 0x20, 0x20
                                             });

        var ms = new MemoryStream();

        var alg = Rijndael.Create();
        alg.Mode = CipherMode.CBC;
        alg.Key = pdb.GetBytes(32);
        alg.IV = pdb.GetBytes(16);

        var cs = new CryptoStream(ms, alg.CreateDecryptor(), CryptoStreamMode.Write);
        cs.Write(enc, 0, enc.Length);
        cs.Close();

        return Encoding.UTF8.GetString(ms.ToArray());
    }
}

Használatuk egyszerű, a kód bemásolása után bármilyen stringre meghívhatod őket:

var secretMessage = "Árvíztűrő-tükörfúrógép";

var encryptedMesssage = secretMessage.Encrypt("fl00d-t0l3r4nt m1rr0r dr1ll");
// encryptedMessage = "5qB0JeE+gk+qcT505YwftIxQDnHzhZ/rROW/JGBLbxE="

var decryptedMessage = encryptedMessage.Decrypt("fl00d-t0l3r4nt m1rr0r dr1ll");
// decryptedMessage = "Árvíztűrő-tükörfúrógép"

Hozzászólások
Király :)
Csak hogy valaki hozzászóljon :)
Thx
Ez egyszerű, értem is és elindulni is eltudok vele, örök hála.