Aybars Arslan

Console.WriteLine("Hello World");

C# ile Encrypt & Decrypt

Encryption verilerin anlaşılmaz hale çevirilmesi durumudur. Encryption önemlidir çünkü,  başkalarının erişmesini istemediğimiz verileri güvenli bir şekilde korumamızı sağlar. basit olarak encyptiondan bahsetiğimize göre şimdi bir string veriyi encrypt edip sonra decrypt ederek çözümleyeceğiz..

Kullanılan bazı sınıf ve metodlar;

Salt :

SHA256 :

RijndaelManaged :

AES :

CipherMode.CBC :

Rfc2898DeriveBytes :

Not : Kütüphanelerimizi eklemeyi unutmuyoruz.

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

static void Main(string[] args)
{
    var content = "content will be encrypted";
    var password = "password123";
    var encryptredStr = Encrypt(content, password);
    var decryptedStr = Decrypt(encryptredStr, password);
}

public static string Encrypt(string text, string password)
{
    // Belirlenen içeriği ve şifreyi byte array olarak alıyoruz.
    var bytesToBeEncrypted = Encoding.UTF8.GetBytes(text);
    var passwordBytes = Encoding.UTF8.GetBytes(password);

    // SHA256 ile şifremizi hashliyoruz.
    passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

    var bytesEncrypted = Encrypt(bytesToBeEncrypted, passwordBytes);

    return Convert.ToBase64String(bytesEncrypted);
}

public static string Decrypt(string encryptedText, string password)
{
    // Get the bytes of the string
    var bytesToBeDecrypted = Convert.FromBase64String(encryptedText);
    var passwordBytes = Encoding.UTF8.GetBytes(password);

    passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

    var bytesDecrypted = Decrypt(bytesToBeDecrypted, passwordBytes);

    return Encoding.UTF8.GetString(bytesDecrypted);
}

private static byte[] Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
{
    byte[] encryptedBytes = null;

    // salt şifre özetlenmeden önce eklenen rasgele bitler
    // salt bytes encyrpt edilecek datanın sonuna ek olarak eklenir.
    var saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 0, Byte.MaxValue, Byte.MinValue };

    // verileri geçici olarak saklamak için memory streamimizi açıyoruz
    using (MemoryStream ms = new MemoryStream())
    {
        // Veriyi anahtar sözcük ile sifrelemeye yarayan ve
        // System.Security.Cryptography namespacesi altında bulunan RijndaelManaged
        using (RijndaelManaged AES = new RijndaelManaged())
        {
            // Rfc2898DeriveBytes sayesinde saltBeytelarımızla passwordBytelarını hasliyoruz
            var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);

            // AES(Advanced Encryption Standard) ile şifrelereme standartlarını belirliyoruz.
            AES.KeySize = 256;
            AES.BlockSize = 128;
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);
            AES.Mode = CipherMode.CBC;

            // ms : byte array bu streame kopyalanır
            // AES.CreateEncryptor() : Simetrik şifreleme nesnesi
            // CryptoStreamMode.Write : Şifrelenmiş straemin yazma işlemi yapacağını bildirir.
            using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                cs.Close();
            }

            encryptedBytes = ms.ToArray();
        }
    }

    return encryptedBytes;
}

private static byte[] Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
{
    byte[] decryptedBytes = null;

    // salt şifre özetlenmeden önce eklenen rasgele bitler
    var saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 0, Byte.MaxValue, Byte.MinValue };

    using (MemoryStream ms = new MemoryStream())
    {
        using (RijndaelManaged AES = new RijndaelManaged())
        {
            var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);

            AES.KeySize = 256;
            AES.BlockSize = 128;
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);
            AES.Mode = CipherMode.CBC;

            using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                cs.Close();
            }

            decryptedBytes = ms.ToArray();
        }
    }

    return decryptedBytes;
}

Referans;

1 – http://www.selamigungor.com/post/7/encrypt-decrypt-a-string-in-csharp

Paylaş !

, , ,

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir