2017-01-24 18 views
-1

Шифрование файла через cryptojs увеличивает размер файла почти на 30%. Это вызывает проблему при расшифровке файла с использованием класса AESManaged в C#. Как сохранить зашифрованный объект как файл без увеличения размера?Шифрование файла CryptoJs, значительно увеличивающее размер файла

Шифрование файлов в JS:

function esp() { 
     selectedFiles = document.getElementById("MainContent_file1"); 
     var sfile = selectedFiles.files[0]; 
     var read = new FileReader(); 
     read.onload = function (e) { 
      var encrypted = CryptoJS.AES.encrypt(read.result, '123456'); 
      var ct = encrypted.toString(); 
      debugger; 
      $.ajax({ 
       async: 'true', 
       url: "http://localhost:51936/WebService1.asmx/FileUpload", 
       method: "POST", 
       processData: 'false', 
       headers: { 
        'content-type': "application/json", 
        'cache-control': "no-cache" 
       }, 
       data: JSON.stringify({ 'folderPath': folderPath, 'uploadData': ct, 'fileName': sfile.name + '.encrypted' }), 
       success: function (response) { 
        console.log(response); 
       }, 
       error: function (xhr, textStatus, error) { 
        console.log(xhr.statusText); 
       } 
      }); 
     } 
     read.readAsDataURL(sfile); 
    } 

Webservice, который сохраняет зашифрованный объект в файл:

[WebMethod] 
    public bool FileUpload(string folderPath, string uploadData, string fileName) 
    { 
     //NOTE: A CODE SCAN TOOL is showing a PATH TRAVERSAL ERROR. a folderPath can be retrieve from DATABASE for remove the error but would affect the performance which is not advisable. 
     bool returnValue = false; 
     try 
     { 
      byte[] byteUploadFile = Convert.FromBase64String(uploadData); 
      BinaryWriter binWriter = new BinaryWriter(File.Open(Path.Combine(folderPath, fileName), FileMode.Create, FileAccess.ReadWrite)); 
      binWriter.Write(byteUploadFile); 
      binWriter.Close(); 
      returnValue = true; 
     } 
     catch (Exception ex) 
     { 
      returnValue = false; 
     } 
     return returnValue; 
    } 
+1

Вы определили, почему это увеличивает размер файла? Моя ставка заключается в том, что результат указан в base64, и именно это вы пишете в файл. –

+0

Я получаю байты от base64 и записываю файл. См. Метод webservice. – Noob

+1

Но что вы пишете base64? Вы пишете сырые байты или байты, закодированные в base64? –

ответ

0

Как я коплю зашифрованную строку (base64) в виде файла является правильным. Однако для того, чтобы правильно его дешифровать и сделать исходный файл из расшифрованной строки, необходима некоторая отрисовка. Ниже показано, как я получаю строку расшифровки из зашифрованного файла и сохраняю ее как исходный файл.

Mywebservice.Mywebservice dts = new Mywebservice.Mywebservice(); 
      using (var rijAlg = new RijndaelManaged()) 
      { 
       rijAlg.Key = keybytes; 
       rijAlg.IV = iv; 
       var decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV); 
       using (var msDecrypt = new MemoryStream(cipherText)) 
       { 
        using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
        { 
         using (var srDecrypt = new StreamReader(csDecrypt)) 
         { 
          plaintext = srDecrypt.ReadToEnd(); 
         } 
        } 
       } 
      } 
      plaintext = plaintext.Substring(23); //This is the part to strip. The first 
      //23 chars are the mime type of the file. Remove that and just save the string data. 
      string name = filename.Replace(".encrypted", ""); 
      dts.FileUpload(folderPath, plaintext, name); //call the same webservice used for saving encrypted object. 
     }