Member 12666574 Ответов: 1

Кодировать и декодировать файл на стороне клиента, прежде чем загружать его с помощью ASP.NET


У меня есть asp.net код для шифрования и дешифрования файлов с помощью Криптография и стеганография чтобы загрузить его на сервер и вернуть, загрузите его тем же способом. но ... asp.net код выполняется на сервере. как сделать так, чтобы процесс шифрования и дешифрования выполнялся на стороне клиента, чтобы избежать атаки man in middle.

У меня нет проблем с кодом, код работает правильно, но я хочу, чтобы шифрование и дешифрование выполнялись на стороне клиента.

Что я уже пробовал:

следующий код-мой asp.net код для шифрования При загрузке:

Я шифрую файл с помощью класса криптографии
затем спрячьте зашифрованный файл с некоторой информацией заголовка в изображение обложки, выбранное пользователем с помощью класса steganography


protected void hidebtn_Click(object sender, EventArgs e)
  {
    if (fileBrowsebtn.HasFile && imageBrowsebtn.HasFile && encPass.Text != "")
    {
        //Get the Input File Name and Extension.
        string fileName = Path.GetFileNameWithoutExtension(fileBrowsebtn.PostedFile.FileName);
        string fileExtension = Path.GetExtension(fileBrowsebtn.PostedFile.FileName);

        //Build the File Path for the original (input) and the encrypted (output) file.
        string input = Server.MapPath("~/Files/") + fileName + fileExtension;                
        string output = Server.MapPath("~/Files/") + fileName + fileExtension + ".aes";

        //Save the Input File, Encrypt it and save the encrypted file in output path.
        fileBrowsebtn.SaveAs(input);
        FileInfo finfo = new FileInfo(input);
        long fileSize = finfo.Length;
        int fileNameSize = Path.GetFileNameWithoutExtension(output).Length;

        //Encrypt the File Using AES and generate encrypted byte array
        Cryptography encryptor = new Cryptography();
        byte[] fileContainer = encryptor.FileEncrypt(input, output, encPass.Text);

        //generate a new password for the next session using the current password  
        string Newpassword = encryptor.CreateRandomPassword(encPass.Text.Length);               
        byte[] Newpasswordbytes = System.Text.Encoding.UTF8.GetBytes(Newpassword);
        //Encrypt the file hash code and the new password using RSA
        byte[] RSAplain = Combine(encryptor.hashcode, Newpasswordbytes);                
         string pkpath = Server.MapPath("publickey.xml");
         byte[] RSAcipher = encryptor.RSAEncryptData(RSAplain, pkpath);
        byte[] header = new byte[3];

        //preparing the encode packet to embedded into the image
        int fileLength = fileContainer.Length;
        header[0] = (byte)((fileLength >> 16) & 0xff);
        header[1] = (byte)((fileLength >> 8) & 0xff);
        header[2] = (byte)(fileLength & 0xff);
        byte[] bytestobehidden = Combine(header, fileContainer);               
        bytestobehidden = Combine(bytestobehidden, RSAcipher);
        fileSize = bytestobehidden.Length;

        //prepare the cover image              
        string imgName = Path.GetFileName(imageBrowsebtn.PostedFile.FileName);
        string imgPath = Server.MapPath("~/Images/") + imgName;
        imageBrowsebtn.SaveAs(imgPath);                
        string stegimgpath = Server.MapPath("~/Images/") + fileName + "stego.bmp";
        Steganography Steg = new Steganography(imgPath);
        Bitmap stegImg = Steg.StegoLayer(fileSize, output, stegimgpath, bytestobehidden);                              
        string stgimgname = Path.GetFileName(stegimgpath);

        //uploading the stego-image and add the file to user DB
        DUser dataowner = new DUser();
        string constring = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Server.MapPath("StorageDB.mdb") + ";";
        dataowner.addFile((fileName + fileExtension), stgimgname, "false", constring);                

        //Delete the original (input) and the encrypted (output) file.
        File.Delete(input);
        File.Delete(output);
    }           
}


следующий код является извлечением кода перед загрузкой :

Во-первых, я извлекаю данные из изображения

затем расшифруйте его, чтобы получить исходный файл

protected void extbtn_Click(object sender, EventArgs e)
  {
    if (fileList.SelectedIndex != -1 && decPass.Text != "")
    {              
        //Get the Input File Name and Extension
        string fileName = Path.GetFileNameWithoutExtension(fileList.SelectedItem.ToString());
        string fileExtension = Path.GetExtension(fileList.SelectedItem.ToString());
        string stgimname = Path.GetFileName(fileList.SelectedItem.Value);

        //Build the File Path for the original (input) and the decrypted (output) file
        string stgpath = Server.MapPath("~/Images/") + stgimname;


        //Extract the encode packet from the stegoimage
        Steganography stg = new Steganography(stgpath);
        string extFName = "";
        byte[] extBytes = stg.ExtractLayer(out extFName);
        int fileLength = (int)(extBytes[0] << 16) +
          (int)(extBytes[1] << 8) +
          (int)extBytes[2];

        //separate the encode packet element in separate arrays to decrypt
        byte[] filebytes = new byte[fileLength];
        byte[] RSACipher = new byte[extBytes.Length - fileLength - 3];
        System.Array.Copy(extBytes, 3, filebytes, 0, fileLength);
        System.Array.Copy(extBytes, fileLength + 3, RSACipher, 0, extBytes.Length - fileLength - 3);

        //decrypt the new password and hashcode using RSA
        Cryptography crypto = new Cryptography();
        string prpath = Server.MapPath("privatekey.xml");               
        byte[] hashplusnewpass = crypto.RSADecryptData(RSACipher,prpath);
        byte[] newpass = new byte[hashplusnewpass.Length - 32];
        byte[] oldhash = new byte[32];
        Array.Copy(hashplusnewpass, 0, oldhash, 0, 32);
        Array.Copy(hashplusnewpass, 32, newpass, 0, newpass.Length);

        //get the new generated password
        string newpasswrd = System.Text.Encoding.UTF8.GetString(newpass);
        Application["NewPass"] = newpasswrd;
         string newpassfile = Server.MapPath("~/Files/") + "newpassword.txt";
        //decrypt the File bytes using AES
        string input = Server.MapPath("~/Files/") + "ext" + extFName;
        string output = Server.MapPath("~/Files/") + "dec" + extFName;
        File.WriteAllBytes(input, filebytes);               
        crypto.FileDecrypt(input, output, decPass.Text);

        // get and compare the current and old hash values to validate the file
        byte[] outfilebytes = File.ReadAllBytes(output);
        byte[] curhashcode = SHA256.Create().ComputeHash(outfilebytes);
        if (!CompareByteArrays(oldhash, curhashcode))
            throw new CryptographicException("File Corrupted!");
        else
        {
           Infolbl.Visible = true;
           Infolbl.Text = "the data file is validated and The password for next session is generated";

        }   
           //Download the Decrypted File.
            Response.Clear();
            Response.ContentType = fileList.SelectedItem.GetType().ToString();
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(output));
            Response.WriteFile(output);
            Response.Flush();

            //Delete the original (input) and the decrypted (output) file.
            File.Delete(input);
            File.Delete(output);
            Response.End();                              
    }           
}

1 Ответов

Рейтинг:
4

F-ES Sitecore

Вы не можете зашифровать файл на клиенте. Ну, вы, вероятно, могли бы это сделать, но это бесполезно, так как вам нужно будет раскрыть свои "секреты", позволяя кому-либо расшифровать ваши данные. Если вы хотите избежать атак man in the middle, то используйте https, вот для чего он существует.


Member 12666574

можете ли вы сказать мне, как использовать https с этим кодом, потому что у меня мало знаний с ним

F-ES Sitecore

Google how to get and apply an ssl certificate on your site, and from there you simply use https://yoursite/yourpage скорее чем http://yoursite/yourpage а браузер делает все остальное. Единственное изменение кода, которое вам может понадобиться, - это перенаправить людей на https-версию, если они перейдут на http-версию.

Richard Deeming

Вы можете получить бесплатный SSL сертификат от Давайте зашифруем[^]. Там даже есть простая утилита командной строки[^] для запуска на сервере, который заставит вас встать и работать в течение нескольких минут.