Geliştiriciler C # şifrelemesini ve şifre çözmeyi nasıl kullanmalıdır?

Yazar | Uncle Meow

Editör | Liu Jing

Üretildi | CSDN (ID: CSDNnews)

Şifreleme ve şifre çözme, genellikle oturum açma parolası şifreleme ve şifre çözme, ileti aktarım şifreleme ve şifre çözme gibi geliştirme sürecinde kullanılır. Ancak, birçok kişi sadece ilkeleri kullanır ve onları anlamaz.Bu makale, şifreleme ve şifre çözme ilkelerini ve kullanımını hızlı bir şekilde öğrenmenizi sağlayacaktır.

Sıfır, şifreleme ve şifre çözme nedir

Layman'ın terimleriyle, şifreleme ve şifre çözme, düzensiz içerik oluşturmak için başkalarının kolayca görmesini istemediğiniz şeyleri belirli kurallara göre işlemektir. Şifrelenmiş içeriği alan kişi, şifrelenmiş içeriği belirli kurallar dahilinde orijinal metne geri yükler. Burada bahsedilen orijinal metne bilgisayarda düz metin, şifrelenmiş içeriğe ise şifreli metin denir. Şifrelenmiş içerik tamamen kırılamaz değildir, sadece kırma zorluğunu artırır ve çoğu insanı geri çeker. Peki bir şifreleme ve şifre çözmenin güvenliği nasıl değerlendirilir? Genel olarak konuşursak, şifreli mesajlar, gönderen ve alıcı geçerken üç koşulu karşılamalıdır:

  • Gönderen, yalnızca hedeflenen alıcının gönderilen mesajın şifresini çözebileceğinden emin olabilir, ancak alıcı olmayan kişinin şifreli metni aldıktan sonra şifresini çözemediği sürece diğer alıcı olmayanların şifreli metni elde edebileceğini garanti etmez;

  • Alıcı, mesajı kimin gönderdiğini belirleyebilir;

  • Alıcı, iletim sırasında mesajın tahrif edilmediğinden emin olabilir, bu da mesajın bütünlüğünü doğrulayabileceği anlamına gelir.

  • Genel olarak konuşursak, yaygın olarak kullanılan üç şifreleme yöntemi vardır:

    • Geri döndürülemez şifreleme;

    • Simetrik tersinir şifreleme;

    • Yığın olmayan tersinir şifreleme.

    Yaygın olarak kullanılan bu üç şifreleme yönteminden bahsedeyim.

    Geri dönüşü olmayan şifreleme

    Yaygın olarak kullanılan geri döndürülemez şifreleme, MD5 şifrelemedir. MD5, Message-Digest Algorithm 5'in kısaltmasıdır. MD5'in özellikleri aşağıdaki gibidir:

  • Herhangi bir uzunluktaki giriş, MD5 işleminden sonra 128-bit bilgi verir Bu bilgiye dijital parmak izi denir;

  • Farklı bilgilerin girilmesiyle üretilen dijital parmak izleri aynı değildir ve dijital parmak izi dünyadaki tek parmak izidir;

  • Şifrelemeden önceki bilgiler dijital parmak izinden türetilemez. MD5 genellikle belge kurcalama korumasında, parola şifrelemede, dijital imza ve ağ diski üzerinden ikinci aktarımda kullanılır. Bu dört husus için aşağıda kısaca açıklayacağım:

  • Belge kurcalamaya dayanıklı

    Belgeyi göndermeden önce belgenin MD5 değerini kaydedin Belgeyi aldıktan sonra, alıcı belgenin MD5 değerini hesaplar.İki MD5 değeri farklıysa, bu, gönderme işlemi sırasında belgenin tahrif edildiği anlamına gelir;

  • Parola şifreleme

    Parola veritabanında düz metin olarak saklanıyorsa, başkaları sızdırıldıktan sonra doğrudan giriş yapabilir.Parola MD5 ile şifrelendikten sonra sızdırılmış olsa bile doğrudan şifre metninde oturum açamaz. Ancak burada belirtmek gerekir ki, İnternette MD5 şifreli metinleri kıran birçok web sitesi vardır. Açıkça söylemek gerekirse, bu web siteleri kütüphaneye basılarak uygulanır. Bu web siteleri, doğum günleri, ardışık aynı numaralar veya şifreler gibi yaygın olarak kullanılan şifre kombinasyonlarını toplar, bu nedenle biz Parola gücünü doğrularken, ortak basit parolalar listelenmelidir.Tüm parolalar için, parolaya rastgele bilgi eklemek ve ardından MD5 şifrelemesini gerçekleştirmek en iyisidir.Bu sözde tuzlamadır;

  • elektronik imza

    Birisi önemli bir belge yazdı Bu belge, özet bilgi oluşturmak için MD5 kullanılarak belgelendirme kuruluşu tarafından onaylanmıştır. Kişi belgenin gelecekte kendisi tarafından yazıldığını anlamazsa, belgelendirme kuruluşunun belge üzerinde yalnızca özet bilgileri ve önceki aydınlatma bilgilerini yeniden oluşturması gerekir. Karşılaştırıldığında, dosyanın yazıldığını bilebilirsiniz;

  • Net Disk İkinci İletimi

    Çevrimiçi disk, ilk kez yüklenen dosyanın MD5 değerini kaydeder Daha sonra, biri aynı MD5 değerine sahip bir dosya yüklediğinde, yalnızca çevrimiçi diskte bulunan bu dosyanın bağlantısının gönderilmesi gerekir.

  • MD5'in uygulanması çok basittir.Kodu aşağıdaki gibidir:

    genel sınıf MD5 { /// < özet > /// /// < / özet > /// < param adı = "kaynak" > Şifrelenecek dize < / param > /// < param adı = "uzunluk" > Şifrelenmiş sonuç uzunluğu < / param > /// < İadeler > Şifrelenmiş dize < /İadeler > public string Encrypt (dize kaynağı, int uzunluk = 32) { eğer (string.IsOrEmpty (kaynak)) { dönüş string.Empty; } HashAlgorithm sağlayıcısı = HashAlgorithm olarak CryptoConfig.CreateFromName ("MD5"); bayt bayt = Encoding.UTF8.GetBytes (kaynak); bayt hashValue = sağlayıcı .Com puteHash (bayt); StringBuilder sb = new StringBuilder; anahtar (uzunluk) { vaka 16: for (int i = 4; i < 12; i ++) { sb.Append (hashValue .ToString ("x2")); } kırmak; vaka 32: for (int i = 0; i < 16; i ++) { sb.Append (hashValue .ToString ("x2")); } kırmak; varsayılan: for (int i = 0; i < hashValue.Length; i ++) { sb.Append (hashValue .ToString ("x2")); } kırmak; } return sb.ToString; } /// < özet > /// Dosyanın MD5'ini alın /// < / özet > /// < param adı = "dosyaAdı" > < / param > /// < İadeler > < /İadeler > public string AbstractFile (string fileName) { FileStream file = new FileStream (fileName, FileMode.Open); System.Security.Cryptography.MD5 md5 = new MD5CryptoServiceProvider; bayt retVal = md5 .Com puteHash (dosya); file.Close; StringBuilder sb = new StringBuilder; for (int i = 0; i < retVal.Length; i ++) { sb.Append (retVal .ToString ("x2")); } return sb.ToString; } }

    Simetrik tersinir şifreleme

    Simetrik tersine çevrilebilir şifreleme, şifrelenmesi gereken içeriği şifrelemek için bir anahtar kullanmak ve ardından şifrelenmiş içeriği alıcıya göndermektir.Alıcı, sokak içeriğinin şifresini çözmek için aynı anahtarı kullandıktan sonra, düz metin elde edilir. Simetrik tersine çevrilebilir şifrelemeyle ilgili ciddi bir sorun, anahtarın güvenliğini sağlamaktır.Anahtar tehlikeye atıldığında, üçüncü bir taraf, alınan şifre metninin şifresini çözmek için bu anahtar çiftini kullanabilir ve hatta alıcıya göndermek üzere bilgileri taklit etmek için kullanabilir. Taraf, şifreli metni kimin gönderdiğini bilemez.

    En yaygın kullanılan simetrik ve geri dönüşümlü şifreleme algoritması DES'tir. Aşağıdaki kod aracılığıyla DES'in uygulanmasına bir göz atalım:

    genel sınıf DES { /// < özet > /// anahtar /// < / özet > özel bayt anahtarı = ASCIIEncoding.ASCII.GetBytes ("123456"); /// < özet > /// Ofset /// < / özet > özel bayt iv = ASCIIEncoding.ASCII.GetBytes ("123456" .Insert (0, "w"). Substring (0, 8)); /// < özet > /// şifreleme /// < / özet > /// < param adı = "metin" > Şifrelenecek değer < / param > /// < İadeler > Şifrelenmiş sonuç < /İadeler > public string Encrypt (dize metni) { DESCryptoServiceProvider dsp = new DESCryptoServiceProvider; (MemoryStream memStream = new MemoryStream) kullanarak { CryptoStream crypStream = new CryptoStream (memStream, dsp.CreateEncryptor (anahtar, iv), CryptoStreamMode.Write); StreamWriter sWriter = new StreamWriter (crypStream); sWriter.Write (metin); sWriter.Flush; crypStream.FlushFinalBlock; memStream.Flush; return Convert.ToBase 64 Dize (memStream.GetBuffer, 0, (int) memStream.Length); } } /// < özet > /// Şifreyi çöz /// < / özet > /// < param name = "encryptText" > < / param > /// < İadeler > Şifresi çözülen sonuç < /İadeler > public string Decrypt (string encryptText) { DESCryptoServiceProvider dsp = new DESCryptoServiceProvider; bayt arabelleği = Convert.FromBase 64 Dize (encryptText); (MemoryStream memStream = new MemoryStream) kullanarak { CryptoStream crypStream = new CryptoStream (memStream, dsp.CreateDecryptor (anahtar, iv), CryptoStreamMode.Write); crypStream.Write (arabellek, 0, arabellek.Uzunluğu); crypStream.FlushFinalBlock; return ASCIIEncoding.UTF8.GetString (memStream.ToArray); } } }

    Asimetrik tersinir şifreleme

    Asimetrik şifreleme daha zahmetlidir.Hem göndericinin hem de alıcının iki anahtarı vardır. Anahtarlardan biri açık bir anahtardır. Açık anahtar herkese açıktır ve herkes onu alabilir. Diğeri özel bir anahtardır. Özel anahtar farklıdır. Kural, A'nın genel anahtarı tarafından şifrelenen bilgilerin şifresinin yalnızca A'nın özel anahtarı ile çözülebilmesi ve A'nın özel anahtarı ile şifrelenen mesajların yalnızca A'nın genel anahtarı ile çözülebilmesidir.

    Tersine çevrilebilir asimetrik şifrelemenin iki modu vardır:

  • Şifreleme modu

    Şifrelemek için alıcının genel anahtarını kullanın ve ardından şifresini çözmek için alıcının özel anahtarını kullanın, böylece bilgileri yalnızca belirli bir alıcı alabilir, ancak gönderenin kim olduğunu doğrulamak imkansızdır.

  • Kimlik Doğrulama Modu

    Şifrelemek için gönderenin özel anahtarını kullanın ve ardından şifresini çözmek için gönderenin genel anahtarını kullanın. Bu, belirli bir gönderenin mesajı göndermesini sağlar, ancak mesajın kime gönderildiğini belirlemek imkansızdır.

  • Yukarıdaki iki modun açıklamasından, sorunları olduğunu görebiliriz, böylece dijital imzalar görünür.Yukarıdaki kimlik doğrulama moduna bir karma algoritma (MD5 gibi) eklenir ve bilgi şifrelenip gönderilmeden önce düz metin işlenir. Dışarı çıktıktan sonra alıcı, bilginin karma değerini, bilginin şifresini çözdükten sonra orijinal mesajın karma değeriyle karşılaştırarak bilginin kurcalanıp kurcalanmadığını belirleyebilir.

    Yaygın olarak kullanılan asimetrik tersinir şifreleme algoritması RSA'dır. Kod aşağıdaki şekilde uygulanır:

    genel sınıf Rsa { /// < özet > /// Şifreleme / şifre çözme çifti alın /// < / özet > /// < İadeler > Şifresini Çöz < /İadeler > genel statik KeyValuePair < dize, dize > GetKeyPair { RSACryptoServiceProvider RSA = yeni RSACryptoServiceProvider; string publicKey = RSA.ToXmlString (false); string privateKey = RSA.ToXmlString (true); yeni KeyValuePair'i döndür < dize, dize > (publicKey, privateKey); } /// < özet > /// şifreleme /// < / özet > /// < param adı = "içerik" > < / param > /// < param name = "encryptKey" > Şifreleme anahtarı < / param > /// < İadeler > < /İadeler > genel statik dize Şifreleme (dize içeriği, dize şifrelemeKey) { RSACryptoServiceProvider rsa = yeni RSACryptoServiceProvider; rsa.FromXmlString (encryptKey); UnicodeEncoding ByteConverter = new UnicodeEncoding; bayt DataToEncrypt = ByteConverter.GetBytes (içerik); bayt resultBytes = rsa.Encrypt (DataToEncrypt, false); return Convert.ToBase 64 String (resultBytes); } /// < özet > /// Şifreyi çöz /// < / özet > /// < param adı = "içerik" > < / param > /// < param adı = "decryptKey" > Şifre çözme anahtarı < / param > /// < İadeler > < /İadeler > public static string Decrypt (string içeriği, string decryptKey) { byte dataToDecrypt = Convert.FromBase 64 Dize (içerik); RSACryptoServiceProvider RSA = yeni RSACryptoServiceProvider; RSA.FromXmlString (decryptKey); bayt resultBytes = RSA.Decrypt (dataToDecrypt, false); UnicodeEncoding ByteConverter = new UnicodeEncoding; return ByteConverter.GetString (sonuçBytes); } /// < özet > /// Yeni bir anahtar kümesi oluşturun /// < / özet > /// < param adı = "içerik" > < / param > /// < param name = "encryptKey" > Şifreleme anahtarı < / param > /// < param adı = "decryptKey" > Şifre çözme anahtarı < / param > /// < İadeler > Şifrelenmiş sonuç < /İadeler > private static string Encrypt (string içeriği, out string publicKey, out string privateKey) { RSACryptoServiceProvider rsaProvider = yeni RSACryptoServiceProvider; publicKey = rsaProvider.ToXmlString (false); privateKey = rsaProvider.ToXmlString (true); UnicodeEncoding ByteConverter = new UnicodeEncoding; bayt DataToEncrypt = ByteConverter.GetBytes (içerik); bayt resultBytes = rsaProvider.Encrypt (DataToEncrypt, false); return Convert.ToBase 64 String (resultBytes); } }

    sonuç olarak

    Yukarıdaki üç şifreleme yöntemi genellikle geliştirme aşamasında kullanılır.Geliştirme konusundaki tecrübelerime göre, daha güvenli olan asimetrik şifrelemeyi kullanmanızı tavsiye ederim.

    Yazar hakkında: Zhu Gang, takma ad Miaoshu, CSDN blog uzmanı, .NET üst düzey geliştirme mühendisi, 7 yıllık ön cephe geliştirme deneyimi, e-devlet sistemi ve AI müşteri hizmetleri sisteminin geliştirilmesine ve İnternet işe alım web sitelerinin mimari tasarımına katıldı. Şu anda Pekin'de çalışıyor. Hengchuang Ronghui Technology Development Co., Ltd. kurumsal düzeyde güvenlik izleme sistemlerinin geliştirilmesiyle ilgilenmektedir.

    Sorumluluk Reddi: Bu makale, yazarın bağımsız bakış açısıdır ve CSDN'nin konumunu temsil etmez.

    SON

    1,2 milyonluk bir zarardan 5,8 milyon kara kadar 3 yıl geçirdim, çünkü neredeyse tüm karı tüketen ve tüm düşüşleri önleyen bir "21 günlük hareketli ortalama" hilesini hatırladım.
    önceki
    900,7 milyar nakit para biriktiren geri dönüş oranı 10 yılın en düşük seviyesinde, eski hissedarlara kızan Buffett "hata yapmaya" başladı
    Sonraki
    Kaç tane çocukluk anısı! Oyuncu Cheng Sihan vefat etti ve hastalık birkaç dakika içinde ölümcül oldu
    Zhang Yaqin, Baidu'dan emekli oldu, teknik konuk akademiye geri döndü
    Notre Dame de Paris'in restorasyonuna Çinli uzmanlar katıldılar, neden bu seçimi yaptılar ve Çin'in ne gibi avantajları var?
    Jack Ma yatırımın yolundan bahsetti: Sırf "Altın Cicada Yasası" nı anladığınız için sıfırdan milyarlarca dolara nasıl geçilir
    157 yaşındaki, "somut olmayan kültürel mirası" yaşatacak ve aktaracak
    KDJ Golden Cha + BOLL ikinci kez orta pistte toparlandı: Bu tür bir hisse senedi satmayın, ana gücün yükselmesini bekleyin ve elinizde var mı bir bakın
    Bekarlar Günü yakında geliyor Size bir Python nesnesi tanıtmak ister misiniz? | CSDN blog seçimi
    Maliye Bölümü'nün kadın profesörü nadiren konuşuyor: Ana yıkama tablasının bu önemli hareketli ortalaması neden altına düşmüyor? "Hareketli ortalamaya geri dönmenin" ana cazibe geri sayımı olduğu ort
    Orada mısın? Bir bina inşa etmeme yardım et
    Eğlenceli başlıklar dibe batıyor
    78 milyondan 900.000'e nasıl çıktım, sırf sürekli olarak "beş katmanın üzerinde satın al, üçüncü katmanın altında sat" yaptığım için, neredeyse tüm kısa vadeli kazançları tüketiyorum
    180 milyon hissedar karanlıkta: Neden "büyük hacim kutudan çıkıp" tamamen düşüyor? Bu makale paha biçilemez, 10 kez okudum, çok keskin ve kapsamlı
    To Top