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.
Szia, tetszett, és megpróbáltam alkalmazni Excelben, azaz .dll fájlban a függvényeit használni. A fájlt meg is találja a VBA, de a függvény meghívásakor azt panaszolja, hogy "Can't find DLL entry point". Nem tudsz véletlenül valami megoldást erre? Már órák óta böngészgetek, sokan panaszolják ugyanezt, de értékelhető megoldást eddig nem találtam rá.
Időközben sikerült megoldani. Itt találtam egy jó leírást a technikáról: https://richnewman.wordpress.com/2007/04/15/a-beginner%E2%80%99s-guide-to-calling-a-net-library-from-excel/

Valamiért a Visual Studió 2013 nem szerette a static beállításokat. A fordításkor 2 warningot adott. Az egyikben közölte, hogy az elkészült dll fájl "…does not contain any types that that can be unregistered for COM interop", a másikban az ellentétét is: "…does not contain any types that that can be registered for COM interop"

Excelben futtatáskor pedig Run time errort adott: "Activex component can't create object."

Namármost a C#-ben kezdő vagyok, de bátor: Töröltem a Class és a függvények static beállítását, és ezzel összhangban a stringek előtt this megjelölést.

Ezzel hibátlanul lefordítódott, és az Excel is gond nélkül használni tudta.

Remélem, hogy nem okoztam ezzel a programban olyan szerkezeti változást, ami a működésben zavart okozhat. Tesztelve az eredményt hibátlannak tűnik. Egy adott szó titkosítási eredményét visszafordítva a Decrypt-el visszaadja az eredeti értéket.

Bocs a hosszú leírásért, de hátha valakinek ezt segíthet a használatban.