.net C# dili ile bir metni (string) ifadeyi nasıl şifrelerim?
Daha sonra bu metnin şifresini nasıl çözerim?
Toplam 1 cevap
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.