C# WinForms ve Mono GTK Console Sistem ve Servis Programlama Yazılım ve Sistem Güvenliği

C# Dosya Şifreleme

Basit ve kullanılı bir dosya şifreleme uygulaması yaptım. Yabancı ziyaretçiler arama motorlarında öne çıkmada katkı sağladığı için kaynak kodlarında ingilizce değişkenler tercih ettim. Dosyayı buradan indirebilirsiniz.

string[] args;
        string outpath = "";

        public MainWindow()
        {
            args = Environment.GetCommandLineArgs();
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            if (args.Length == 1)
            {
                MessageBox.Show("Please open with a file parameter");
                Application.Current.Shutdown();
            }
        }

        private void EncryptFile(string inputFile, string password)
        {
            byte[] salt = GenerateRandomSalt();
            FileStream fsCrypt = new FileStream(inputFile + ".myencrypted", FileMode.Create);
            byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password);
            
            RijndaelManaged AES = new RijndaelManaged();
            AES.KeySize = 256;
            AES.BlockSize = 128;
            AES.Padding = PaddingMode.PKCS7;
            
            var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000);
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);
            AES.Mode = CipherMode.CFB;
            fsCrypt.Write(salt, 0, salt.Length);

            CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write);

            FileStream fsIn = new FileStream(inputFile, FileMode.Open);
            byte[] buffer = new byte[1048576];
            int read;

            try
            {
                while ((read = fsIn.Read(buffer, 0, buffer.Length)) > 0)
                {
                    cs.Write(buffer, 0, read);
                }
                fsIn.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }
            finally
            {
                cs.Close();
                fsCrypt.Close();
            }
        }

        private void DecryptFile(string inputFile, string outputFile, string password)
        {
            byte[] passwordBytes = System.Text.Encoding.UTF8.GetBytes(password);
            byte[] salt = new byte[32];

            FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);
            fsCrypt.Read(salt, 0, salt.Length);

            RijndaelManaged AES = new RijndaelManaged();
            AES.KeySize = 256;
            AES.BlockSize = 128;
            var key = new Rfc2898DeriveBytes(passwordBytes, salt, 50000);
            AES.Key = key.GetBytes(AES.KeySize / 8);
            AES.IV = key.GetBytes(AES.BlockSize / 8);
            AES.Padding = PaddingMode.PKCS7;
            AES.Mode = CipherMode.CFB;

            CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateDecryptor(), CryptoStreamMode.Read);

            FileStream fsOut = new FileStream(outputFile, FileMode.Create);

            int read;
            byte[] buffer = new byte[1048576];

            try
            {
                while ((read = cs.Read(buffer, 0, buffer.Length)) > 0)
                {
                    fsOut.Write(buffer, 0, read);
                }
            }
            catch (CryptographicException ex_CryptographicException)
            {
                Console.WriteLine("CryptographicException error: " + ex_CryptographicException.Message);
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error: " + ex.Message);
            }

            try
            {
                cs.Close();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Error by closing CryptoStream: " + ex.Message);
            }
            finally
            {
                fsOut.Close();
                fsCrypt.Close();
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            start();
        }
        private void pbx_KeyUp(object sender, KeyEventArgs e)
        {
            if (e.Key== Key.Enter)
            {
                start();
            }
        }

        public static byte[] GenerateRandomSalt()
        {
            byte[] data = new byte[32];

            using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
            {
                for (int i = 0; i < 10; i++)
                {
                    rng.GetBytes(data);
                }
            }

            return data;
        }
        
        void start()
        {
            for (int i = 1; i < args.Count(); i++)
            {
                outpath = args[i].Substring(0, args[i].LastIndexOf('\\'));
                if (args[i].EndsWith(".myencrypted"))
                {
                    DecryptFile(args[i], args[i].Replace(".myencrypted",""), pbx.Password);
                }
                else
                {
                    EncryptFile(args[i], pbx.Password);
                }
            }
            Application.Current.Shutdown();
        }

 

5 Comments

  • Gökhan
    20 Ekim 2018 - 09:10 | Permalink

    merhaba metin bey,
    ben yaptığım programları şifrelemek istiyorum hem kodları gizlemek hem kullanılmasını engellemek için.Programı kullanabilmek için şifre soracak ve bu şifre ayda bir değişecek nasıl yapabilirim

    • meto260
      20 Ekim 2018 - 13:21 | Permalink

      Merhaba, Programı derlemeniz kodların gizlenmesini sağlar. Sadece derleme sonrasında oluşan klasördekileri kullanıcılarla paylaşmanız yeterlidir. Bu makine diline derlenmiş durumdan kodların çözülmesi için tersine mühendislik gerekir ve bu bile %100 geri dönüş sağlamayacaktır.

      Programı kullanırken şifre sorması tamamen size bağlıdır. Tarifi basit bir yöntem söylemek gerekirse; Program.cs dosyası programınızın start alacağı yerdir. Şifre soran bir sayfa oluşturursunuz ve program.cs dosyasına ilk olarak bu sayfadan açılmasını belirtirsiniz. Burada şifre doğru değilse eğer application.current.shutdown() edersiniz.

  • Gökhan
    22 Ekim 2018 - 05:05 | Permalink

    Amacım sürekli şifre sorması değil ayda bir sormasını istiyorum ve bu şifre sürekli değişken olucak şifreyi girmedikçe programa erişim sağlanamayacak yapmak istediğim bu.Cevabınız için teşekkürler.

    • meto260
      23 Ekim 2018 - 16:20 | Permalink

      Şifreyi sormasını istediğiniz yere tarih koşulu koyarsınız ve zamanlı sorar. Ayrıca şifre değişsin istiyorsanız tarih ile belli bir text arasında algoritma kurarsınız. Bu sizin için tahmin edilebilir olurken kullanıcı için değişken olur. Bu konuda sorduğunuz soruya istinaden basit bir çözüm önerdim. Elbetteki bunun birçok yolu var. Araştırmaya devam edebilir veya birinden yazılım desteği alabilirsiniz. Ama beklentiniz bu konunun başlığındaki dosya şifreleme ile ayrı yollara çıkıyor. Postuma yorum bıraktığınız için teşekkür ederim.

  • Gökhan
    24 Ekim 2018 - 12:12 | Permalink

    cevabınız için ben teşekkür ederim.

  • Bir cevap yazın

    E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir