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

0

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

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

alattin alattin (16984)
10 yıl önce sordu

    Toplam 1 Cevap


    0

    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.

    alattin alattin (16984)
    10 yıl önce cevaplandı

      üyelik gerektirir

      Cevap yazabilmek için üye girişi yapmalısınız.

      Eğer uzmanim.net üyesiyseniz giriş yapabilirsiniz: üye girişi yap
      uzmanim.net'e üye olmak çok kolaydır: hemen kayıt ol