.net C# ile bir metni şifreleme / şifresini çözme nasıl yapılır?

alattin (16999) 10 yıl önce sordu

.net C# dili ile bir metni (string) ifadeyi nasıl şifrelerim?

Daha sonra bu metnin şifresini nasıl çözerim?  

Toplam 1 cevap


alattin (16999) 10 yıl önce cevapladı

AES (Advanced Encryption Standard; Gelişmiş Şifreleme Standardı), elektronik verinin şifrelenmesi için sunulan bir standarttır. Amerikan Hükümeti tarafından kabul edilen AES, uluslararası alanda da defacto şifreleme (kripto) standardı olarak kullanılmaktadır. DES'in (Data Encryption Standard - Veri Şifreleme Standardı) yerini almıştır. AES ile tanımlanan şifreleme algoritması, hem şifreleme hem de şifreli metni çözmede kullanılan anahtarların birbiriyle ilişkili olduğu, simetrik-anahtarlı bir algoritmadır. AES için şifreleme ve şifre çözme anahtarları aynıdır. (Wikipedia)

Aşağıda RijndaelManaged sınıfı kullanılarak C# ile şifreleme ve şifre çözme işlemine dair bir örnek sınıf bulacaksınız.

RijndaelManaged sınıfı kullarak AES ile bir metni C# ile şifrelemek ve deşifre edebilmek için Crypto.cs sınıfını projenize ekleyin.

Crypto.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace WindowsFormsApplication10
{
    public class Crypto
    {
        private static byte[] _salt = Encoding.ASCII.GetBytes("o6806642kbM7c5");

        /// <summary>
        /// uzmanim.net Verilen string ifadeyi AES kullanarak şifreler. Şifrelenen metin        
        /// uzmanim.net DecryptStringAES() kullanılarak şifresi çözülebilir. 
        /// 
        /// </summary>
        /// <param name="plainText">şifrelenecek metin</param>
        /// <param name="sharedSecret">şifreleme için kullanılacak parola</param>
        public static string SifreleAES(string plainText, string sharedSecret)
        {
            if (string.IsNullOrEmpty(plainText))
                throw new ArgumentNullException("plainText");
            if (string.IsNullOrEmpty(sharedSecret))
                throw new ArgumentNullException("sharedSecret");

            string outStr = null;                      
            RijndaelManaged aesAlg = null;            

            try
            {
               
                Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);               
                aesAlg = new RijndaelManaged();
                aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);

               
                ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

               
                using (MemoryStream msEncrypt = new MemoryStream())
                {
                   
                    msEncrypt.Write(BitConverter.GetBytes(aesAlg.IV.Length), 0, sizeof(int));
                    msEncrypt.Write(aesAlg.IV, 0, aesAlg.IV.Length);
                    using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                    {
                        using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                        {                          
                            swEncrypt.Write(plainText);
                        }
                    }
                    outStr = Convert.ToBase64String(msEncrypt.ToArray());
                }
            }
            finally
            {
               
                if (aesAlg != null)
                    aesAlg.Clear();
            }

           
            return outStr;
        }
        /// <summary>
        /// EncryptStringAES() ile şifrelenen metnin şifresini çözer.        
        /// <param name="cipherText">Deşifre edilecek metin uzmanim.net</param>
        /// <param name="sharedSecret">Paylaşılan gizli anahtar</param>
        public static string SifreyiCozAES(string cipherText, string sharedSecret)
        {
            if (string.IsNullOrEmpty(cipherText))
                throw new ArgumentNullException("cipherText");
            if (string.IsNullOrEmpty(sharedSecret))
                throw new ArgumentNullException("sharedSecret");

           
            RijndaelManaged aesAlg = null;

          
            string plaintext = null;

            try
            {
               
                Rfc2898DeriveBytes key = new Rfc2898DeriveBytes(sharedSecret, _salt);

                               
                byte[] bytes = Convert.FromBase64String(cipherText);
                using (MemoryStream msDecrypt = new MemoryStream(bytes))
                {
                  
                    aesAlg = new RijndaelManaged();
                    aesAlg.Key = key.GetBytes(aesAlg.KeySize / 8);                  
                    aesAlg.IV = ReadByteArray(msDecrypt);
                    
                    ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
                    using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                    {
                        using (StreamReader srDecrypt = new StreamReader(csDecrypt))

                         //uzmanim.net
                            plaintext = srDecrypt.ReadToEnd();
                    }
                }
            }
            finally
            {
              
                if (aesAlg != null)
                    aesAlg.Clear();
            }

            return plaintext;
        }

        private static byte[] ReadByteArray(Stream s)
        {
            byte[] rawLength = new byte[sizeof(int)];
            if (s.Read(rawLength, 0, rawLength.Length) != rawLength.Length)
            {
                throw new SystemException("Stream did not contain properly formatted byte array");
            }

            byte[] buffer = new byte[BitConverter.ToInt32(rawLength, 0)];
            if (s.Read(buffer, 0, buffer.Length) != buffer.Length)
            {
                throw new SystemException("Did not read byte array properly");
            }

            return buffer;
        }
    }
}

Class içerisindeki SifreleAES ve SifreyiCozAES statik metodlardır ve yeni bir sınıf örneği türetmeden kullanılabilirler.

Örnek kullanım;

Metni Şifreleme

string SifreliMetin = Crypto.SifreleAES("Şifrelenecek M", "PaylaşılanGizliAnahtar");

Şifreli Metni Çözme:

 string DesifreEdilmisMetin = Crypto.SifreyiCozAES(txtSifreli.Text, "PaylaşılanGizliAnahtar");

"PaylaşılanGizliAnahtar" AES ile şifreleme ve Şifre çözmede kullanılacak ortak paylaşılan paroladır. Rastgele seçilmelidir.

Örnek Visual Studio 2010 Windows Form uygulamasını buradan indirebilirsiniz.