2016-03-26 20 views
0

Resim şifreleme programı geliştiriyorum. İki uygulamamız var. Bunlardan biri, görüntüyü bayt dizisine dönüştürme ve Rijndael ile şifreleme. Şifrelenmiş bayt dizisini bir dosyaya kaydettikten sonra. İkinci uygulama şifresini çözmek içindir. Dosyadan bayt dizisini okuyorum. Çözümü çözdükten sonra resimdeki resmi gösterdim.Görüntü Şifreleme Dolgu Alma Hatası

Ama "Dolgu geçersiz ve kaldırılamıyor" alıyorum. şifre çözme uygulamasında hata.

Şu anda bu kod numaralı bir dosyaya şifreli bayt dizisini kaydediyorum (bayt dizisi için doğru yol olduğundan emin değilim?);

protected bool SaveData(string FileName, byte[] Data) 
     { 
      BinaryWriter Writer = null; 

      try 
      { 
       // Create a new stream to write to the file 
       Writer = new BinaryWriter(File.Open(FileName,FileMode.OpenOrCreate)); 

       // Writer raw data     
       Writer.Write(Data); 
       Writer.Flush(); 
       Writer.Close(); 
      } 
      catch 
      { 
       return false; 
      } 

      return true; 
     } 

Bu yöntemin dosya konumunu ve şifreli bayt dizisini kaydetmesini sağlıyorum. Ve işe yaradı. Ama bilmiyorum, doğru yol mu?

Ve şifre çözme uygulamam şifreli bayt dizisini dosya yönteminden okuma;

protected byte[] GetData(string FileName) 
{ 
    FileInfo f = new FileInfo(FileName); 
    BinaryReader br = new BinaryReader(File.Open(FileName, FileMode.Open)); 
    byte[] a = br.ReadBytes(Convert.ToInt32(f.Length)); 
    return a; 
} 

ve hata konum şifre çözme yöntemi;

public static byte[] DecryptBytes(byte[] encryptedBytes, string passPhrase, string saltValue) 
     { 
      RijndaelManaged RijndaelCipher = new RijndaelManaged(); 

      RijndaelCipher.Mode = CipherMode.CBC; 
      byte[] salt = Encoding.ASCII.GetBytes(saltValue); 
      PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, salt, "SHA1", 2); 

      ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(password.GetBytes(32), password.GetBytes(16)); 

      MemoryStream memoryStream = new MemoryStream(encryptedBytes); 
      CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read); 
      byte[] plainBytes = new byte[encryptedBytes.Length]; 


      int DecryptedCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length); // I am getting error this line. Padding is invalid and cannot be removed. 



      memoryStream.Flush(); 
      cryptoStream.Flush(); 
      memoryStream.Close(); 
      cryptoStream.Close(); 

      return plainBytes; 
     } 

Şifreleme Kod

public static byte[] EncryptBytes(byte[] inputBytes, string passPhrase, string saltValue) 
     { 
      RijndaelManaged RijndaelCipher = new RijndaelManaged(); 
      RijndaelCipher.Mode = CipherMode.CBC; 
      byte[] salt = Encoding.ASCII.GetBytes(saltValue); 
      PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, salt, "SHA1", 2); 
      ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(password.GetBytes(32), password.GetBytes(16)); 
      MemoryStream memoryStream = new MemoryStream(); 
      CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write); 
      cryptoStream.Write(inputBytes, 0, inputBytes.Length); 
      cryptoStream.FlushFinalBlock(); 
      byte[] CipherBytes = memoryStream.ToArray(); 
      memoryStream.Close(); 
      cryptoStream.Close(); 
      return CipherBytes; 
     } 

Tam Kod Şifre çözme Uygulama

namespace ImageDecrypte 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private string EncPass; 
     private string line; 
     private string OkunanVeri; 
     private byte[] SifreliDosyaDizi; 
     private byte[] CozulmusDosyaDizi; 
     private const string SaltPass = "CodeWork"; 
     private string Sfre; 
     private string dyol; 

     private void button1_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog file = new OpenFileDialog(); 
      file.Filter = "Şifrelenmiş Dosyalar (*.cw)|*.cw"; 
      file.FilterIndex = 2; 
      file.RestoreDirectory = true; 
      file.CheckFileExists = false; 
      file.Title = "Şifrelenmiş Dosya Seçiniz.."; 
      file.InitialDirectory = 
     Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
      if (file.ShowDialog() == DialogResult.OK) 
      { 
       dyol = file.FileName; 
       string DosyaAdi = file.SafeFileName; 
       label1.Text = DosyaAdi; 
       Sfre = textBox1.Text; 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      Sfre = textBox1.Text; 
      SifreliDosyaDizi = GetData(dyol); 
      CozulmusDosyaDizi = DecryptBytes(SifreliDosyaDizi, Sfre, SaltPass); 
      pictureBox1.Image = byteArrayToImage(CozulmusDosyaDizi); 
     } 

     public static byte[] DecryptBytes(byte[] encryptedBytes, string passPhrase, string saltValue) 
     { 
      RijndaelManaged RijndaelCipher = new RijndaelManaged(); 

      RijndaelCipher.Mode = CipherMode.CBC; 
      byte[] salt = Encoding.ASCII.GetBytes(saltValue); 
      PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, salt, "SHA1", 2); 

      ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(password.GetBytes(32), password.GetBytes(16)); 

      MemoryStream memoryStream = new MemoryStream(encryptedBytes); 
      CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read); 
      byte[] plainBytes = new byte[encryptedBytes.Length]; 


      int DecryptedCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length); 


      memoryStream.Flush(); 
      cryptoStream.Flush(); 
      memoryStream.Close(); 
      cryptoStream.Close(); 

      return plainBytes.Take(DecryptedCount).ToArray(); 
     } 

     public Image byteArrayToImage(byte[] byteArrayIn) 
     { 
      MemoryStream ms = new MemoryStream(byteArrayIn); 
      Image returnImage = Image.FromStream(ms); 
      return returnImage; 
     } 

     //File To Byte Array  ################################################################### 
     protected byte[] GetData(string FileName) 
     { 
      FileInfo f = new FileInfo(FileName); 
      BinaryReader br = new BinaryReader(File.Open(FileName, FileMode.Open)); 
      byte[] a = br.ReadBytes(Convert.ToInt32(f.Length)); 
      return a; 
     } 
     //File To Byte Array  ################################################################### 
    } 
} 

Tam Kod Şifreleme Uygulaması

namespace ImageEncrypte 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private string EncPass; 
     private byte[] byteArrayForImage; 
     private byte[] byteArrayCoded; 
     private const string SaltPass = "CodeWork"; 

     private void button1_Click(object sender, EventArgs e) 
     { 
      OpenFileDialog file = new OpenFileDialog(); 
      file.Filter = "Jpeg Dosyası |*.jpg| Png Dosyası|*.png"; 
      file.FilterIndex = 2; 
      file.RestoreDirectory = true; 
      file.CheckFileExists = false; 
      file.Title = "Bir İmaj Dosyası Seçiniz.."; 
      file.InitialDirectory = 
     Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
      EncPass = textBox1.Text; 
      if (file.ShowDialog() == DialogResult.OK) 
      { 
       string DosyaYolu = file.FileName; 
       string DosyaAdi = file.SafeFileName; 
       label1.Text = DosyaAdi; 
       Image img = Image.FromFile(DosyaYolu); 
       pictureBox1.Image = img; 
       byteArrayForImage = imageToByteArray(img); 
       byteArrayCoded = EncryptBytes(byteArrayForImage, EncPass, SaltPass); 
      } 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      SaveFileDialog sf = new SaveFileDialog(); 
      sf.Title = "Şifrelenmiş Dosyayı Kaydet"; 
      sf.CheckFileExists = false; 
      sf.CheckPathExists = true; 
      sf.RestoreDirectory = true; 
      sf.DefaultExt = "cw"; 
      sf.FileName = "EncodedFile"; 
      sf.SupportMultiDottedExtensions = false; 
      sf.Filter = "Şifrelenmiş Dosyalar (*.cw)|*.cw"; 
      sf.InitialDirectory = 
     Environment.GetFolderPath(Environment.SpecialFolder.Desktop); 
      if (sf.ShowDialog() == DialogResult.OK) 
      { 
       string DosyaYolu = sf.FileName; 

       bool cevap = SaveData(DosyaYolu, byteArrayCoded); 
       if (cevap) 
       { 
        MessageBox.Show("OK"); 
       } 
       else 
       { 
        MessageBox.Show("PROBLEM"); 
       } 


      } 
     } 


     //Image To Byte Array  #################################################################### 
     public byte[] imageToByteArray(System.Drawing.Image imageIn) 
     { 
      using (var ms = new MemoryStream()) 
      { 
       imageIn.Save(ms, System.Drawing.Imaging.ImageFormat.Gif); 
       return ms.ToArray(); 
      } 
     } 
     //Image To Byte Array  #################################################################### 

     //Byte Array To File  ################################################################### 
     protected bool SaveData(string FileName, byte[] Data) 
     { 
      BinaryWriter Writer = null; 

      try 
      { 
       // Create a new stream to write to the file 
       Writer = new BinaryWriter(File.Open(FileName,FileMode.OpenOrCreate)); 

       // Writer raw data     
       Writer.Write(Data); 
       Writer.Flush(); 
       Writer.Close(); 
      } 
      catch 
      { 
       return false; 
      } 

      return true; 
     } 
     //Bytte Array To File  ################################################################### 

     //EncryptBytes    ################################################################### 
     public static byte[] EncryptBytes(byte[] inputBytes, string passPhrase, string saltValue) 
     { 
      RijndaelManaged RijndaelCipher = new RijndaelManaged(); 
      RijndaelCipher.Mode = CipherMode.CBC; 
      byte[] salt = Encoding.ASCII.GetBytes(saltValue); 
      PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, salt, "SHA1", 2); 
      ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(password.GetBytes(32), password.GetBytes(16)); 
      MemoryStream memoryStream = new MemoryStream(); 
      CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write); 
      cryptoStream.Write(inputBytes, 0, inputBytes.Length); 
      cryptoStream.FlushFinalBlock(); 
      byte[] CipherBytes = memoryStream.ToArray(); 
      memoryStream.Close(); 
      cryptoStream.Close(); 
      return CipherBytes; 
     } 
     //EncryptBytes    ################################################################### 
    } 
} 

Çılgın bir adam olmaya başlamadan önce ne yapabilirim? Teşekkürler ve değerli cevaplarınızı bekliyorum.

+0

bir CryptoStream muhtemelen daha kolay ve – Plutonix

+0

Evet ama accualy bu program tabanlı posta transferi daha kolay olurdu. Yani şifrelenmiş dosyalar posta ile başka bir adam gönderir. Ve şifre çözme uygulaması, posta eki indirmek ve şifresini çözmek. –

+0

Bize "Şifrele()" işlevini göstermediniz. –

cevap

0

Maximilian Gerhardt Çözümü buradadır;

public static byte[] EncryptBytes(byte[] inputBytes, string passPhrase, string saltValue) 
    { 
     RijndaelManaged RijndaelCipher = new RijndaelManaged(); 
     RijndaelCipher.Mode = CipherMode.CBC; 
     RijndaelCipher.Padding = PaddingMode.PKCS7; 

     byte[] salt = Encoding.UTF32.GetBytes(saltValue); 
     //byte[] salt = Encoding.ASCII.GetBytes(saltValue); 
     PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, salt, "SHA1", 2); 
     ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(password.GetBytes(32), password.GetBytes(16)); 
     MemoryStream memoryStream = new MemoryStream(); 
     CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write); 
     cryptoStream.Write(inputBytes, 0, inputBytes.Length); 
     cryptoStream.FlushFinalBlock(); 
     cryptoStream.Flush(); 
     byte[] CipherBytes = memoryStream.ToArray(); 
     memoryStream.Close(); 
     cryptoStream.Close(); 
     return CipherBytes; 
    } 


    public static byte[] DecryptBytes(byte[] encryptedBytes, string passPhrase, string saltValue) 
    { 
     RijndaelManaged RijndaelCipher = new RijndaelManaged(); 

     RijndaelCipher.Mode = CipherMode.CBC; 
     RijndaelCipher.Padding = PaddingMode.PKCS7; 
     byte[] salt = Encoding.UTF32.GetBytes(saltValue); 
     //byte[] salt = Encoding.ASCII.GetBytes(saltValue); 
     PasswordDeriveBytes password = new PasswordDeriveBytes(passPhrase, salt, "SHA1", 2); 

     ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(password.GetBytes(32), password.GetBytes(16)); 

     MemoryStream memoryStream = new MemoryStream(encryptedBytes); 
     CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read); 
     byte[] plainBytes = new byte[encryptedBytes.Length]; 


     int DecryptedCount = cryptoStream.Read(plainBytes, 0, plainBytes.Length); 


     memoryStream.Flush(); 
     cryptoStream.Flush(); 
     memoryStream.Close(); 
     cryptoStream.Close(); 

     return plainBytes.Take(DecryptedCount).ToArray(); 
    } 

    public static byte[] GetData(string FileName) 
    { 
     return File.ReadAllBytes(FileName); 
    } 

    protected bool SaveData(string FileName, byte[] Data) 
    { 
     try 
     { 
      File.WriteAllBytes(FileName, Data); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    }