Simetrik şifreleme için ECB ile blok şifreleme kullanmayın
(AES, 3DES, ... için geçerlidir)
İşte bir gönderi ve ECB modunun nasıl şifrelenmemiş bir kodla sonuçlandığına dair çok benzer bir Microsoft KB makalesi.
Ayrıca Rook 'dan bu benzer gönderiye bakın
Düz metin mesajı:
ECB modu ile şifrelenen mesajın aynısı (hangi şifreyi kullandığınız önemli değil):
CBC modunu kullanan TAM aynı mesaj (yine, ne olduğu önemli değil kullandığınız şifre):
Yanlış yol
public static string Encrypt (string toEncrypt, string key, bool useHashing) { bayt [] keyArray = UTF8Encoding.UTF8.GetBytes (anahtar); bayt [] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toEncrypt); if (useHashing) keyArray = new MD5CryptoServiceProvider (). ComputeHash (anahtar); ComputeHash (anahtar) ) {Key = keyArray, Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7}; ICryptoTransform cTransform = tdes.CreateEncryptor (); bayt [] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray; (resultArray, 0, resultArray.Length);}
Hata aşağıdaki satırdadır
{Key = keyArray, Mode = CipherMode.ECB , Padding = PaddingMode.PKCS7};
Doğru yol
Microsoft'taki iyi arkadaşlar, yukarıda bağlantısı verilen KB makalesini düzeltmem için bana aşağıdaki kodu gönderdiler. Buna 111021973179005 numaralı durumda başvurulur
Bu örnek kod, verileri şifrelemek için AES kullanıyor ve AES şifrelemesinin anahtarı, SHA256 tarafından oluşturulan karma koddur. AES, Gelişmiş Şifreleme Standardı (AES) algoritmasıdır. AES algoritması permütasyonlara ve ikamelere dayanmaktadır. Permütasyonlar verilerin yeniden düzenlenmesidir ve ikameler bir veri birimini diğeriyle değiştirir. AES, birkaç farklı teknik kullanarak permütasyonlar ve ikameler gerçekleştirir. AES hakkında daha fazla ayrıntı için lütfen http://msdn.microsoft.com/en-us/magazine/cc164055.aspx .
SHA, Güvenli Karma Algoritmadır. SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512) artık önerilmektedir. .NET Framework'te Hash Değerleri hakkında daha ayrıntılı bilgi için lütfen http://msdn.microsoft.com/en-us/library/92f9ye3s.aspx#hash_values adresine bakın.
AesCryptoServiceProvider
için simetrik algoritmanın çalıştırılmasına yönelik modun varsayılan değeri CBC'dir. CBC, Şifreleme Bloğu Zincirleme modudur. Geri bildirimi tanıtır. Her düz metin bloğu şifrelenmeden önce, bit düzeyinde özel OR işlemiyle önceki bloğun şifreleme metni ile birleştirilir. Bu, düz metin birçok özdeş blok içerse bile, her birinin farklı bir şifreleme metin bloğuna şifrelenmesini sağlar. Başlatma vektörü, blok şifrelenmeden önce bit düzeyinde özel VEYA işlemiyle ilk düz metin bloğu ile birleştirilir. Şifreleme metin bloğunun tek bir biti karıştırılırsa, karşılık gelen düz metin bloğu da karıştırılır. Ek olarak, sonraki blokta orijinal karıştırılmış bit ile aynı konumda bulunan bir bit karıştırılacaktır. CipherMode
hakkında daha ayrıntılı bilgi için lütfen http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx adresine bakın.
İşte örnek kod.
// Bu işlev, verileri anahtar ve iv ile şifrelemek için kullanılır.
bayt [] Şifrele (bayt [] veri, bayt [] anahtar, bayt [] iv) {// Bir AESCryptoProvider oluşturun. using (var aesCryptoProvider = new AesCryptoServiceProvider ()) {// AESCryptoProvider'ı anahtar ve iv ile başlatın. aesCryptoProvider.KeySize = key.Length * 8; aesCryptoProvider.IV = iv; aesCryptoProvider.Key = anahtar; // AESCryptoProvider'dan şifreleyici oluşturun. kullanarak (ICryptoTransform encryptor = aesCryptoProvider.CreateEncryptor ()) {// Şifrelenmiş verileri depolamak için bellek akışı oluşturun. kullanarak (MemoryStream stream = new MemoryStream ()) {// Verileri şifrelemek için bir CryptoStream oluşturun. using (CryptoStream cryptoStream = new CryptoStream (stream, encryptor, CryptoStreamMode.Write)) // Verileri şifreleyin. cryptoStream.Write (veri, 0, veri.Uzunluğu); // şifrelenmiş verileri döndür. return stream.ToArray (); }}}} // Bu işlev, anahtar ve iv.byte [] Şifre çözme (bayt [] veri, bayt [] anahtar, bayt [] iv) {// Bir AESCryptoServiceProvider oluşturarak verilerin şifresini çözmek için kullanılır. using (var aesCryptoProvider = new AesCryptoServiceProvider ()) {// AESCryptoServiceProvier'i anahtar ve iv ile başlatın. aesCryptoProvider.KeySize = key.Length * 8; aesCryptoProvider.IV = iv; aesCryptoProvider.Key = anahtar; // AESCryptoServiceProvider'dan şifre çözücü oluşturun. kullanarak (ICryptoTransform decryptor = aesCryptoProvider.CreateDecryptor ()) {// Şifrelenmiş verileri içeren bir bellek akışı oluşturun. kullanarak (MemoryStream stream = new MemoryStream (data)) {// Şifrelenmiş verilerin şifresini çözmek için bir CryptoStream oluşturun. using (CryptoStream cryptoStream = new CryptoStream (stream, decryptor, CryptoStreamMode.Read)) {// Bir bayt arabellek dizisi oluşturun.
bayt [] readData = yeni bayt [1024]; int readDataCount = 0; // Şifresi çözülmüş verileri depolamak için bir bellek akışı oluşturun. kullanarak (MemoryStream resultStream = new MemoryStream ()) {do {// Verilerin şifresini çözün ve verileri readData arabellek dizisine yazın. readDataCount = cryptoStream.Read (readData, 0, readData.Length); // Şifresi çözülmüş verileri resultStream'e yazın. resultStream.Write (readData, 0, readDataCount); } // Akışta daha fazla şifrelenmiş veri olup olmadığını kontrol edin. while (readDataCount > 0); // Şifresi çözülmüş verileri döndür. sonuçStream.ToArray (); }}}}}} // Bu işlev, UTF8 kodlaması ve SHA256 karma algoritması ile geçerli bir anahtar ikili oluşturmak için kullanılır. Bayt [] GetKey (dize anahtarı) {// SHA256 karma algoritma sınıfı oluşturun. using (SHA256Managed sha256 = new SHA256Managed ()) // Dize anahtarının kodunu ikili olarak çöz ve anahtarın karma ikili değerini hesapla. return sha256.ComputeHash (Encoding.UTF8.GetBytes (key));}
Örnek koddaki sınıflarla ilgili daha fazla ayrıntı için lütfen aşağıdaki bağlantılara bakın:
· AesCryptoServiceProvider Sınıfı
· SHA256Yönetilen Sınıf
· CryptoStream Sınıfı
Ayrıca, .NET Framework'te şifrelemenin daha iyi anlaşılmasına yardımcı olabilecek birkaç makale vardır, lütfen aşağıdaki bağlantılara bakın:
· Şifreleme Hizmetleri
· .NET Framework Şifreleme Modeli
· Basit Bir Kriptografi Rehberi
· Olmadan Şifreleme Sırlar