[C#] Aiuto implementazione metodo in form

di il
16 risposte

[C#] Aiuto implementazione metodo in form

Ciao a tutti vorrei come implementare questo metodo della classe AES:

public void EncryptFile()
{
    string file = "C:\\SampleFile.DLL";
    string password = "abcd1234";

    byte[] bytesToBeEncrypted = File.ReadAllBytes(file);
    byte[] passwordBytes = Encoding.UTF8.GetBytes(password);

    // Hash the password with SHA256
    passwordBytes = SHA256.Create().ComputeHash(passwordBytes);

    byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);

    string fileEncrypted = "C:\\SampleFileEncrypted.DLL";

    File.WriteAllBytes(fileEncrypted, bytesEncrypted);
}
in un Form, in modo che quando premo un pulsante mi cripti il file.

private void button1_Click(object sender, EventArgs e)
        {
	    //qui cosa devo mettere? 	
            MessageBox.Show("Testo criptato!");
        }
Grazie mille

16 Risposte

  • Re: [C#] Aiuto implementazione metodo in form

    Ma questa classe AES dove sta?
  • Re: [C#] Aiuto implementazione metodo in form

    oregon ha scritto:


    Ma questa classe AES dove sta?
    Posto tutto il codice allora:
    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;
    using System.Security.Cryptography;
    
    namespace AESDemo
    {
        class AES
        {
            public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes)
            {
                byte[] encryptedBytes = null;
    
                // Set your salt here, change it to meet your flavor:
                byte[] saltBytes = passwordBytes;
                // Example:
                //saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
    
                using (MemoryStream ms = new MemoryStream())
                {
                    using (RijndaelManaged AES = new RijndaelManaged())
                    {
                        AES.KeySize = 256;
                        AES.BlockSize = 128;
    
                        var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                        AES.Key = key.GetBytes(AES.KeySize / 8);
                        AES.IV = key.GetBytes(AES.BlockSize / 8);
    
                        AES.Mode = CipherMode.CBC;
    
                        using (CryptoStream cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
                            cs.Close();
                        }
                        encryptedBytes = ms.ToArray();
                    }
                }
    
                return encryptedBytes;
            }
    
            public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes)
            {
                byte[] decryptedBytes = null;
                // Set your salt here to meet your flavor:
                byte[] saltBytes = passwordBytes;
                // Example:
                //saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
    
                using (MemoryStream ms = new MemoryStream())
                {
                    using (RijndaelManaged AES = new RijndaelManaged())
                    {
                        AES.KeySize = 256;
                        AES.BlockSize = 128;
    
                        var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000);
                        AES.Key = key.GetBytes(AES.KeySize / 8);
                        AES.IV = key.GetBytes(AES.BlockSize / 8);
    
                        AES.Mode = CipherMode.CBC;
    
                        using (CryptoStream cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                        {
                            cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
                            cs.Close();
                        }
                        decryptedBytes = ms.ToArray();
                    }
                }
    
                return decryptedBytes;
            }
            
    	public void EncryptFile()
            {
                string file = "C:\\SampleFile.DLL";
                string password = "abcd1234";
    
                byte[] bytesToBeEncrypted = File.ReadAllBytes(file);
                byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
    
                // Hash the password with SHA256
                passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
    
                byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);
    
                string fileEncrypted = "C:\\SampleFileEncrypted.DLL";
    
                File.WriteAllBytes(fileEncrypted, bytesEncrypted);
            }
    
            public void DecryptFile()
            {
                string fileEncrypted = "C:\\SampleFileEncrypted.DLL";
                string password = "abcd1234";
    
                byte[] bytesToBeDecrypted = File.ReadAllBytes(fileEncrypted);
                byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
                passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
    
                byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes);
    
                string file = "C:\\SampleFile.DLL";
                File.WriteAllBytes(file, bytesDecrypted);
            }
    	
    [i]        public static string Encrypt(string text, byte[] passwordBytes)
            {
                byte[] originalBytes = Encoding.UTF8.GetBytes(text);
                byte[] encryptedBytes = null;
    
                // Hash the password with SHA256
                passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
    
                // Getting the salt size
                int saltSize = GetSaltSize(passwordBytes);
                // Generating salt bytes
                byte[] saltBytes = GetRandomBytes(saltSize);
    
                // Appending salt bytes to original bytes
                byte[] bytesToBeEncrypted = new byte[saltBytes.Length + originalBytes.Length];
                for (int i = 0; i < saltBytes.Length; i++)
                {
                    bytesToBeEncrypted[i] = saltBytes[i];
                }
                for (int i = 0; i < originalBytes.Length; i++)
                {
                    bytesToBeEncrypted[i + saltBytes.Length] = originalBytes[i];
                }
    
                encryptedBytes = AES_Encrypt(bytesToBeEncrypted, passwordBytes);
    
                return Convert.ToBase64String(encryptedBytes);
            }
    
            public static string Decrypt(string decryptedText, byte[] passwordBytes)
            {
                byte[] bytesToBeDecrypted = Convert.FromBase64String(decryptedText);
    
                // Hash the password with SHA256
                passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
    
                byte[] decryptedBytes = AES_Decrypt(bytesToBeDecrypted, passwordBytes);
    
                // Getting the size of salt
                int saltSize = GetSaltSize(passwordBytes);
    
                // Removing salt bytes, retrieving original bytes
                byte[] originalBytes = new byte[decryptedBytes.Length - saltSize];
                for (int i = saltSize; i < decryptedBytes.Length; i++)
                {
                    originalBytes[i - saltSize] = decryptedBytes[i];
                }
    
                return Encoding.UTF8.GetString(originalBytes);
            }[/i]
    
            public static int GetSaltSize(byte[] passwordBytes)
            {
                var key = new Rfc2898DeriveBytes(passwordBytes, passwordBytes, 1000);
                byte[] ba = key.GetBytes(2);
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < ba.Length; i++)
                {
                    sb.Append(Convert.ToInt32(ba[i]).ToString());
                }
                int saltSize = 0;
                string s = sb.ToString();
                foreach (char c in s)
                {
                    int intc = Convert.ToInt32(c.ToString());
                    saltSize = saltSize + intc;
                }
    
                return saltSize;
            }
    
            public static byte[] GetRandomBytes(int length)
            {
                byte[] ba = new byte[length];
                RNGCryptoServiceProvider.Create().GetBytes(ba);
                return ba;
            }
        }
    }
    
    e poi il mio form
    
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace AESDemo
    {
    
    
    
        public partial class Form2 : Form
        {
            
    
            public Form2()
            {
                InitializeComponent();
            }
    
    
            private void button1_Click(object sender, EventArgs e)
            {
    		//??
                MessageBox.Show("Testo Criptato!");
            }
    
            private byte[] GetPasswordBytes()
            {
    
                byte[] ba = null;
    
                if (secureTextBox1.Text.Length == 0)
                    ba = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };
                else
                {
                    // Convert System.SecureString to Pointer
                    IntPtr unmanagedBytes = Marshal.SecureStringToGlobalAllocAnsi(secureTextBox1.SecureText);
                    try
                    {
                        unsafe
                        {
                            byte* byteArray = (byte*)unmanagedBytes.ToPointer();
    
                            // Find the end of the string
                            byte* pEnd = byteArray;
                            while (*pEnd++ != 0) { }
                            int length = (int)((pEnd - byteArray) - 1);
    
                            ba = new byte[length];
    
                            for (int i = 0; i < length; ++i)
                            {
                                // Work with data in byte array as necessary, via pointers, here
                                byte dataAtIndex = *(byteArray + i);
                                ba[i] = dataAtIndex;
                            }
                        }
                    }
                    finally
                    {
                        // This will completely remove the data from memory
                        Marshal.ZeroFreeGlobalAllocAnsi(unmanagedBytes);
                    }
                }
    
                return System.Security.Cryptography.SHA256.Create().ComputeHash(ba);
            }
    
        }
    }
    
    
  • Re: [C#] Aiuto implementazione metodo in form

    La cosa migliore, se ho capito bene il tuo problema, è di aggiungere alla classe una funzione EncryptFile(string filein, string fileout)
    public void EncryptFile(string filein, string fileout)
    {
        string password = "abcd1234";
    
        byte[] bytesToBeEncrypted = File.ReadAllBytes(filein);
        byte[] passwordBytes = Encoding.UTF8.GetBytes(password);
    
        // Hash the password with SHA256
        passwordBytes = SHA256.Create().ComputeHash(passwordBytes);
    
        byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes);
    
        File.WriteAllBytes(fileout, bytesEncrypted);
    }
    che poi richiami dal tuo pulsante
    ...
    AES.AES_Decrypt("fileininput...","fileinoutput...");
    Da notare che nei nomi dei metodi potresti togliere il prefisso "AES_", per ovvi motivi..., così come la EncryptFile() potrebbe chiamarsi tranquillamente Encrypt()
  • Re: [C#] Aiuto implementazione metodo in form

    candaluar ha scritto:


    che poi richiami dal tuo pulsante
    
    AES.AES_Decrypt("fileininput...","fileinoutput...");
    
    Da notare che nei nomi dei metodi potresti togliere il prefisso "AES_", per ovvi motivi..., così come la EncryptFile() potrebbe chiamarsi tranquillamente Encrypt()
    Ho capito, però perché
    AES.AES_Decrypt("fileininput...","fileinoutput...");
    e non
    AES.EncryptFile(???);?
    però ad AES.EncryptFile(???) cosa gli devo passare dentro la parentesi? I nomi dei due file scritti dentro una textbox?
  • Re: [C#] Aiuto implementazione metodo in form

    Hai detto che vuoi criptare un file: ebbene nel primo parametro ci metti una stringa contenente il nome del file da criptate e nel secondo parametro ci metti il nome del file che vuoi generare.
  • Re: [C#] Aiuto implementazione metodo in form

    candaluar ha scritto:


    Hai detto che vuoi criptare un file: ebbene nel primo parametro ci metti una stringa contenente il nome del file da criptate e nel secondo parametro ci metti il nome del file che vuoi generare.
    Esatto, quindi sarebbe tipo:
    
    private void button1_Click(object sender, EventArgs e)
            {
                
                AES.EncryptFile(filein, fileout);
                MessageBox.Show("Testo Criptato!");
            }
    
    edit: no scusa mi sa che non ho capito bene come fare ad implementarlo con il pulsante
  • Re: [C#] Aiuto implementazione metodo in form

    candaluar ha scritto:


    Hai detto che vuoi criptare un file: ebbene nel primo parametro ci metti una stringa contenente il nome del file da criptate e nel secondo parametro ci metti il nome del file che vuoi generare.
    Facendo:
    
    private void button1_Click(object sender, EventArgs e)
            {
                string fileini = "D:\\Download\\Scuola\\C++\\Visual Studio\file1.txt";
                string fileauto = "D:\\Download\\Scuola\\C++\\Visual Studio\file2.txt";
                AES.EncryptFile(fileini, fileauto);
            }
    
    Mi esce sto errore:
    An object reference is required for the non-static field, method, or property AES.EncryptFile '(string, string)'
  • Re: [C#] Aiuto implementazione metodo in form

    La funzione deve essere public static altrimenti ti serve istanziare un oggetto
  • Re: [C#] Aiuto implementazione metodo in form

    candaluar ha scritto:


    La funzione deve essere public static altrimenti ti serve istanziare un oggetto
    Persiste
    
    error CS0120: An object reference is required for the non-static field, method, or property 'AES.EncryptFile(string, string)'
    
  • Re: [C#] Aiuto implementazione metodo in form

    Intendo il metodo EncryptFile()
  • Re: [C#] Aiuto implementazione metodo in form

    candaluar ha scritto:


    Intendo il metodo EncryptFile()
    Ho risolto dichiarandolo static (public lo era già) adesso lo compila, però quando vado a premere il bottone mi esce il messaggio d'errore: *foto allegata*
  • Re: [C#] Aiuto implementazione metodo in form

    Scusa ma non vedo la foto allegata: ti consiglio di descrivere l'errore, basta copiare il testo del messaggio che ti compare
  • Re: [C#] Aiuto implementazione metodo in form

    candaluar ha scritto:


    Scusa ma non vedo la foto allegata: ti consiglio di descrivere l'errore, basta copiare il testo del messaggio che ti compare
    Ho risolto, praticamente applicavo la funzione che decriptava al file da criptare e quindi dava errori.
  • Re: [C#] Aiuto implementazione metodo in form

    candaluar ha scritto:


    Scusa ma non vedo la foto allegata: ti consiglio di descrivere l'errore, basta copiare il testo del messaggio che ti compare
    Ho bisogno di un altro aiuto:
    
    public void button_Click_D_Open(object sender, EventArgs e)
            {
                Stream myStream = null;
                OpenFileDialog openFileDialog1 = new OpenFileDialog();
    
                openFileDialog1.InitialDirectory = "c:\\";
                openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
                openFileDialog1.FilterIndex = 2;
                openFileDialog1.RestoreDirectory = true;
    
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    try
                    {
                        if ((myStream = openFileDialog1.OpenFile()) != null)
                        {
                            using (myStream)
                            {
                                string fileini_D = openFileDialog1.FileName;
                                textFileScelto.Text = fileini_D;
                                string fileauto_D = "D://Download/Scuola/C++/Visual Studio/decriptato.test.rtf";                           
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error: Could not read file from disk. Original error: " + ex.Message);
                    }
                }
            }
    
    Praticamente qui scelto il file che andrò a criptare/decriptare. però se voglio non decriptarlo subito (solo selezionandolo) ma successivamente con un altro bottone:
    
            public void Decypt_File_Click(object sender, EventArgs e)
            {
                AES.DecryptFile(fileini_D, fileauto_D);
            }
    
    Mi dice che fileini_D e fileauto_D "does not exist in the current context" come posso utlizzarli al di fuori dello stesso bottone?
Devi accedere o registrarti per scrivere nel forum
16 risposte