.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 (15286)
7 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 (15286)
    7 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