Шифрование SJCL приводит к неправильному размеру файла

Я успешно реализовал метод шифрования AES Роба Напьера для iOS в одном из моих приложений. Теперь я хотел бы иметь возможность шифровать и расшифровывать файлы из этого приложения с помощью моей реализации JavaScript. Я использую FileReader, чтобы получить локальный файл от пользователя и загрузить его с помощью

reader.readAsArrayBuffer(file);

Когда это будет сделано, файл будет зашифрован с помощью Стэнфордской криптобиблиотеки JavaScript, и, наконец, зашифрованный файл можно будет загрузить:

reader.onloadend = function(e) {

    var content = new Uint8Array(e.target.result);
    var utf8 = "";
    for (var i = 0, len = content.length; i < len; i++) {
         utf8 += String.fromCharCode(content[i]);
    }
    var b64 = btoa(utf8);

    //we finally encrypt it 
    var encrypted = sjcl.encrypt(password, b64,{ks:256});
    var json = JSON.parse(encrypted);
    var ciphertext = json.ct;

    a.attr('href', 'data:application/octet-stream,' + ciphertext);
    a.attr('download', file.name + '.encrypted');

    step(4);

    };

reader.readAsArrayBuffer(file);

Проблема в том, что зашифрованный файл намного больше оригинала. Это не относится к моей реализации для iOS, которая работает нормально. И, конечно же, его невозможно расшифровать без ошибок. Фактически результирующий файл будет иметь размер 0 байт.

Я надеюсь, что кто-то может указать мне на ошибку в моем коде. Это было бы действительно здорово.

@ Дункан:

Спасибо. Я изучил это, но я не совсем уверен во всех шагах, которые мне нужно предпринять. Особенно то, что они означают в коде. Может, здесь кто-нибудь поможет мне. Большое спасибо!

Шифрование

  1. Сгенерируйте случайную соль шифрования
  2. Сгенерируйте ключ шифрования с помощью PBKDF2 (см. Документацию на вашем языке, чтобы узнать, как это вызвать). Передайте пароль в виде строки, случайную соль шифрования и 10 000 итераций.
  3. Создать случайную соль HMAC
  4. Сгенерируйте ключ HMAC с помощью PBKDF2 (см. Документацию на вашем языке, чтобы узнать, как это вызвать). Передайте пароль в виде строки, случайную соль HMAC и 10 000 итераций.
  5. Создать случайный IV
  6. Зашифруйте данные, используя ключ шифрования (вверху), IV (вверху), AES-256 и режим CBC. Это режим по умолчанию почти для всех библиотек шифрования AES.
  7. Передайте свой заголовок и зашифрованный текст в функцию HMAC вместе с ключом HMAC (см. Выше) и PRF «SHA-256» (названия функций PRF см. В документации вашей библиотеки; это также можно назвать «SHA- 2, 256 бит »).
  8. Соедините эти элементы вместе в формате, указанном выше.

person freshking    schedule 02.12.2013    source источник
comment
RNCryptor использует специальный формат для ввода и вывода. Вам нужно будет принять это во внимание при попытке интеграции с некоторым кодом JavaScript.   -  person Duncan Jones    schedule 02.12.2013
comment
Я начал работу над реализацией JavaScript формата RNCryptor (он появится на github.com/RNCryptor, когда готов). JavaScript слишком медленный, чтобы обрабатывать настройки RNCryptor по умолчанию. Вы должны уменьшить количество итераций PBKDF2, иначе на шифрование или расшифровку данных уйдет несколько минут, даже в браузере для настольных компьютеров (мне страшно подумать, что потребуется для вычислений на мобильном устройстве).   -  person Rob Napier    schedule 08.01.2014
comment
Это действительно замечательно слышать. Заранее большое спасибо. Было бы здорово иметь это.   -  person freshking    schedule 09.01.2014


Ответы (1)


Зашифруйте данные, используя ключ шифрования (вверху), IV (вверху), AES-256 и режим CBC. Это режим по умолчанию почти для всех библиотек шифрования AES.

Это ложное предположение, согласно this sjcl использует ccm как режим по умолчанию.

person erdeszt    schedule 03.12.2013
comment
Мне самому это было интересно. Может быть, это возможно с помощью CryptoJS? - person freshking; 03.12.2013
comment
@freshking Я не уверен, что вы имеете в виду, вы можете использовать sjcl в режиме cbc, это просто не режим по умолчанию. Используйте: sjcl.encrypt (пароль, b64, {ks: 256, mode: 'ccm'}) Но помните, что в конфигурации могут быть другие отличия, поэтому проверьте ссылку, которую я дал. - person erdeszt; 03.12.2013
comment
Я только что прочитал о режиме CBC в SCJL, и, похоже, он не работает: cryptojs. altervista.org/secretkey/doc/doc_aes_stanford.html - person freshking; 03.12.2013
comment
Вы правы, в sjcl его совсем нет, бедняга. Возможно, вы можете попробовать cryptojs, но я с этим не знаком. - person erdeszt; 03.12.2013
comment
поддерживает ли SJCL режим EBC? - person Novice; 02.06.2014