Кодировать и декодировать файл на стороне клиента, прежде чем загружать его с помощью 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(); } }