C# İle Şifreleme : Simetrik, Asimetrik ve Hash Şifreleme
- 38,581 Kez Okundu
- C#
- 10 Yorum
- 2015-07-21 04:22:11
Verilerimizin güvenliğini sağlayabilmek için kodlarımızı ya da verimizi şifrelemek gereği duyarız. Şifrelenen veriye tekrar geri dönüşüm sağlanarak ulaşmak istediğimizde kullanılan algoritmalar ve geri dönüşümü sağlanamayacak bilindik algoritmalar ile birer örnek yaparak kullanımını inceleyelim.
.Net ile beraber bir çok şifreleme kütüphanesi hazır olarak geliyor. Bu şifreleme sınıfları System.Security.Cryptography kütüphanesi içerisinde yeralmaktadır.
Öncelikli olarak şifreleme yöntemlerini sınıflandırmakta fayda var, şu an dünya üzerinde 3 farklı şifreleme yöntemi bulunmaktadır. Bunlar
- Hash Şifreleme Yöntemleri
- MD5
- SHA1
- SHA256
- SHA384
- SHA512
- Simetrik Şifreleme Yöntemleri
- DES
- Triple DES
- RC2
- Rijndael
- Asimetrik Şifreleme Yöntemleri
- DSA
- RSA
Hash Şifreleme Yöntemleri
Şifrelenen veriye tekrar ulaşmanız mümkün değildir. Şöyleki varsayalım 1000 karakterlik bir veriyi md5, sha 1, sha256 veya sha512 ile şifrelediniz bu durumda elde edeceğiniz şifrelenmiş veri algoritma türüne göre standart boyutta bir karakter katarı olacaktır. Pek tabi şöyle bir soru ortaya çıkacaktır, "eğer şifrelediğim veriye ulaşamayacaksam niye şifreleyim". Bu sorunun cevabı çok basit, bazı yaptığımız uygulamalarda şifrelenmemiş veriyi görmemiz gerekmez, örneğin bir forum açtınız, kullanıcılarınız sisteme üye olarak foruma girebilecek. İşte burada dürüst bir programcı gibi davranarak, kullanıcının girdiği şifre bilgisini Hash algoritma ile şifreleyip veritabanımızda saklamak daha doğru olacaktır. Böylece login işlemi sırasında kullanıcının girdiği veriyi tekrar şifreleyip veritabınındaki şifrelenmiş veri ile karşılaştırabiliriz. Böylece hem kullanıcının şifresini görmeyip kullanıcının özel bilgilerine saygı göstermiş oluruz hemde veri güvenliği sağlamış oluruz.
public static byte[] ByteDonustur(string deger) { UnicodeEncoding ByteConverter = new UnicodeEncoding(); return ByteConverter.GetBytes(deger); } public static byte[] Byte8(string deger) { char[] arrayChar = deger.ToCharArray(); byte[] arrayByte = new byte[arrayChar.Length]; for (int i = 0; i < arrayByte.Length; i++) { arrayByte[i] = Convert.ToByte(arrayChar[i]); } return arrayByte; }
MD5 Şifreleme
public string MD5(string strGiris) { if (strGiris == "" || strGiris==null) { throw new ArgumentNullException("Şifrelenecek veri yok"); } else { MD5CryptoServiceProvider sifre = new MD5CryptoServiceProvider(); byte[] arySifre = ByteDonustur(strGiris); byte[] aryHash = sifre.ComputeHash(arySifre); return BitConverter.ToString(aryHash); } }
SHA1 Şifreleme
public string SHA1(string strGiris) { if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri yok."); }else { SHA1CryptoServiceProvider sifre = new SHA1CryptoServiceProvider(); byte[] arySifre = ByteDonustur(strGiris); byte[] aryHash = sifre.ComputeHash(arySifre); return BitConverter.ToString(aryHash); } }
SHA256 Şifreleme
public string SHA256(string strGiris) { if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek Veri Yok"); }else { SHA256Managed sifre = new SHA256Managed(); byte[] arySifre = ByteDonustur(strGiris); byte[] aryHash = sifre.ComputeHash(arySifre); return BitConverter.ToString(aryHash); } }
SHA384 Şifreleme
public string SHA384(string strGiris) { if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri bulunamadı."); }else { SHA384Managed sifre = new SHA384Managed(); byte[] arySifre = ByteDonustur(strGiris); byte[] aryHash = sifre.ComputeHash(arySifre); return BitConverter.ToString(aryHash); } }
SHA512 Şifreleme
public string SHA512(string strGiris) { if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri yok."); } else { SHA512Managed sifre = new SHA512Managed(); byte[] arySifre = ByteDonustur(strGiris); byte[] aryHash = sifre.ComputeHash(arySifre); return BitConverter.ToString(aryHash); } }
Simetrik Şifreleme
Simetrik şifreleme yöntemlerinde şifrelenen veriye ulaşmak için şifreyi çözen tarafın veriyi şifreleyen tarafla aynı anahtara ihtiyacı vardır.
public static byte[] ByteDonustur(string deger) { UnicodeEncoding ByteConverter = new UnicodeEncoding(); return ByteConverter.GetBytes(deger); } public static byte[] Byte8(string deger) { char[] arrayChar = deger.ToCharArray(); byte[] arrayByte = new byte[arrayChar.Length]; for (int i = 0; i < arrayByte.Length; i++) { arrayByte[i] = Convert.ToByte(arrayChar[i]); } return arrayByte; }
C# ile DES Şifreleme Yöntemi
public string DESSifrele(string strGiris) { string sonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri yok"); } else { byte[] aryKey = Byte8("12345678"); // BURAYA 8 bit string DEĞER GİRİN byte[] aryIV = Byte8("12345678"); // BURAYA 8 bit string DEĞER GİRİN DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, cryptoProvider.CreateEncryptor(aryKey, aryIV), CryptoStreamMode.Write); StreamWriter writer = new StreamWriter(cs); writer.Write(strGiris); writer.Flush(); cs.FlushFinalBlock(); writer.Flush(); sonuc = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); writer.Dispose(); cs.Dispose(); ms.Dispose(); } return sonuc; } public string DESCoz(string strGiris) { string strSonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri yok."); } else { byte[] aryKey = Byte8("12345678"); byte[] aryIV = Byte8("12345678"); DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); MemoryStream ms = new MemoryStream(Convert.FromBase64String(strGiris)); CryptoStream cs = new CryptoStream(ms, cryptoProvider.CreateDecryptor(aryKey, aryIV), CryptoStreamMode.Read); StreamReader reader = new StreamReader(cs); strSonuc = reader.ReadToEnd(); reader.Dispose(); cs.Dispose(); ms.Dispose(); } return strSonuc; }
C# ile TripleDES Şifreleme Yöntemi
TripleDES algoritması 24 bit anahtar ve 8 bit iv değeri kullanır.
public string Sifrele(string strGiris) { string sonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri yok."); } else { byte[] aryKey = Byte8("123456781234567812345678"); byte[] aryIV = Byte8("12345678"); TripleDESCryptoServiceProvider dec = new TripleDESCryptoServiceProvider(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, dec.CreateEncryptor(aryKey, aryIV), CryptoStreamMode.Write); StreamWriter writer = new StreamWriter(cs); writer.Write(strGiris); writer.Flush(); cs.FlushFinalBlock(); writer.Flush(); sonuc = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); writer.Dispose(); cs.Dispose(); ms.Dispose(); } return sonuc; } public string Coz(string strGiris) { string strSonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri yok."); } else { byte[] aryKey = Byte8("123456781234567812345678"); byte[] aryIV = Byte8("12345678"); TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider(); MemoryStream ms = new MemoryStream(Convert.FromBase64String(strGiris)); CryptoStream cs = new CryptoStream(ms, cryptoProvider.CreateDecryptor(aryKey, aryIV), CryptoStreamMode.Read); StreamReader reader = new StreamReader(cs); strSonuc = reader.ReadToEnd(); reader.Dispose(); cs.Dispose(); ms.Dispose(); } return strSonuc; }
C# ile RC2 Şifreleme Yöntemi
RC2 algoritması 8 bit anahtar ve 8 bit iv değeri kullanır.
public string Sifrele(string strGiris) { string sonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri yok."); } else { byte[] aryKey = Byte8("12345678"); byte[] aryIV = Byte8("12345678"); RC2CryptoServiceProvider dec = new RC2CryptoServiceProvider(); MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, dec.CreateEncryptor(aryKey, aryIV), CryptoStreamMode.Write); StreamWriter writer = new StreamWriter(cs); writer.Write(strGiris); writer.Flush(); cs.FlushFinalBlock(); writer.Flush(); sonuc = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); writer.Dispose(); cs.Dispose(); ms.Dispose(); } return sonuc; } public string Coz(string strGiris) { string strSonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifresi çözülecek veri yok."); } else { byte[] aryKey = Byte8("12345678"); byte[] aryIV = Byte8("12345678"); RC2CryptoServiceProvider cp = new RC2CryptoServiceProvider(); MemoryStream ms = new MemoryStream(Convert.FromBase64String(strGiris)); CryptoStream cs = new CryptoStream(ms, cp.CreateDecryptor(aryKey, aryIV), CryptoStreamMode.Read); StreamReader reader = new StreamReader(cs); strSonuc = reader.ReadToEnd(); reader.Dispose(); cs.Dispose(); ms.Dispose(); } return strSonuc; }
C# ile Rijndael Şifreleme Yöntemi
Rijndael algoritması 8 anahtar ve 16 bit iv değeri kullanır.
public string Sifrele(string strGiris) { string sonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrelenecek veri yok."); } else { byte[] aryKey = Byte8("12345678"); byte[] aryIV = Byte8("1234567812345678"); RijndaelManaged dec = new RijndaelManaged(); dec.Mode = CipherMode.CBC; MemoryStream ms = new MemoryStream(); CryptoStream cs = new CryptoStream(ms, dec.CreateEncryptor(aryKey, aryIV), CryptoStreamMode.Write); StreamWriter writer = new StreamWriter(cs); writer.Write(strGiris); writer.Flush(); cs.FlushFinalBlock(); writer.Flush(); sonuc = Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); writer.Dispose(); cs.Dispose(); ms.Dispose(); } return sonuc; } public string Coz(string strGiris) { string strSonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Şifrezi çözülecek veri yok."); } else { byte[] aryKey = Byte8("12345678"); byte[] aryIV = Byte8("1234567812345678"); RijndaelManaged cp = new RijndaelManaged(); MemoryStream ms = new MemoryStream(Convert.FromBase64String(strGiris)); CryptoStream cs = new CryptoStream(ms, cp.CreateDecryptor(aryKey, aryIV), CryptoStreamMode.Read); StreamReader reader = new StreamReader(cs); strSonuc = reader.ReadToEnd(); reader.Dispose(); cs.Dispose(); ms.Dispose(); } return strSonuc; }
Asimetrik Şifreleme
Asimetrik şifreleme yöntemleri ileri düzey şifreleme yöntemleridir. Bu algoritma türünde veriyi şifreleyen taraf ile veriyi çözecek olan taraf birbirinden farklı anahtarlar kullanırlar.
public static byte[] ByteDonustur(string deger) { UnicodeEncoding ByteConverter = new UnicodeEncoding(); return ByteConverter.GetBytes(deger); } public static byte[] Byte8(string deger) { char[] arrayChar = deger.ToCharArray(); byte[] arrayByte = new byte[arrayChar.Length]; for (int i = 0; i < arrayByte.Length; i++) { arrayByte[i] = Convert.ToByte(arrayChar[i]); } return arrayByte; }
C# ile RSA Şifreleme Yöntemi
public string Sifrele(string strGiris, out RSAParameters prm) { string strSonuc = ""; if (strGiris == "") { throw new ArgumentNullException("Şifrelenecek veri yok."); } else { byte[] aryDizi = ByteDonustur(strGiris); RSACryptoServiceProvider dec = new RSACryptoServiceProvider(); prm = dec.ExportParameters(true); byte[] aryDonus = dec.Encrypt(aryDizi, false); strSonuc = Convert.ToBase64String(aryDonus); } return strSonuc; } public string Coz(string strGiris, RSAParameters prm) { string strSonuc = ""; if (strGiris == "" || strGiris == null) { throw new ArgumentNullException("Çözülecek kayıt yok"); } else { RSACryptoServiceProvider dec = new RSACryptoServiceProvider(); byte[] aryDizi = Convert.FromBase64String(strGiris); UnicodeEncoding UE = new UnicodeEncoding(); dec.ImportParameters(prm); byte[] aryDonus = dec.Decrypt(aryDizi, false); strSonuc = UE.GetString(aryDonus); } return strSonuc;
İsterseniz bu şifreleme yöntemlerini kullanarak daha güçlü şifrelemeler elde edebilirsiniz ya da kendi şifreleme algoritmanızı oluşturabilirsiniz , tercih sizin...