2013-10-18 7 views
5

Şu anda bir dizeyi şifrelemenin ve C# 'da AES-128 simetrik şifrelemeyi kullanarak bir bayt dizisinin şifresini çözmenin bir yoluna ihtiyacım var. Bunu yapmanın bir yolunu bulamıyorum, ama belki bir şeyleri özledim.IV olmadan AES 128'i kullanarak nasıl şifreleyebilir ve şifresini çözebilirim?

+2

Neden IVs kaçınmak istersin? Onlar önemli bir güvenlik özelliğidir. – CodesInChaos

+0

@CodesInChaos yorumunu genişletmek için. IV'ler rastgele oluşturulabilir ve şifreli metin ile birlikte net olarak iletilebilir. Güvenlik için IV'ün gizliliği gerekli değildir. Bir IV için gereklilikler aynı anahtarı ve IV kombinasyonu tekrar kullanmamanız ve IV'ün öngörülmesi zor olmasıdır. – Dev

+0

Bu soru, birisinin IV olmadan AES kullanarak şifrelenmesiyle ilgilendiği bir proje içindi. Yine de önemli bir güvenlik özelliği olduklarına katılıyorum! – kdh

cevap

11

İthalat ad

using System; 
using System.IO; 
using System.Text; 
using System.Security.Cryptography; 

    static void Main(string[] args) 
     { 
      string value = "@arifansari300<3>"; 

      string encryptedValue= EncryptDecrypt.Encrypt(value); 

      string decryptedValue = EncryptDecrypt.Decrypt(encryptedValue); 
     } 

    public static string Encrypt(string clearText) 
    { 
     string EncryptionKey = "MAKV2SPBNI99212"; 
     byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); 
     using (Aes encryptor = Aes.Create()) 
     { 
      Rfc2898DeriveBytes pdb = new 
       Rfc2898DeriveBytes(EncryptionKey, new byte[] 
       { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(clearBytes, 0, clearBytes.Length); 
        cs.Close(); 
       } 
       clearText = Convert.ToBase64String(ms.ToArray()); 
      } 
     } 
     return clearText; 
    } 

    public static string Decrypt(string cipherText) 
    { 
     string EncryptionKey = "MAKV2SPBNI99212"; 
     byte[] cipherBytes = Convert.FromBase64String(cipherText); 
     using (Aes encryptor = Aes.Create()) 
     { 
      Rfc2898DeriveBytes pdb = new 
       Rfc2898DeriveBytes(EncryptionKey, new byte[] 
       { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(cipherBytes, 0, cipherBytes.Length); 
        cs.Close(); 
       } 
       cipherText = Encoding.Unicode.GetString(ms.ToArray()); 
      } 
     } 
     return cipherText; 
    } 
+1

'Rfc2898DeriveBytes', son kullanıcı tarafından girilen parolaları doğru anahtar oluşturmak yerine kullanmanız gerektiğinde yalnızca iyi bir seçimdir. Ama bu durumda bir tuz kullanmalısınız (örneğinizde bu sabittir, IV'lerin noktasını gözden kaçırır) ve daha fazla yineleme (en az 20k, tercihen daha fazla). Doğru bir anahtarınız varsa, normal şifreleme daha basit ve * çok daha hızlı *. – CodesInChaos

+0

Bu işlevi PHP'ye nasıl dönüştürebilirim? – user3581428

+0

@CodesInChaos "Normal şifreleme" ile ne demek istiyorsun? –