RNCryptor JS простой случай не удается

Я успешно использовал RNCryptor в Objective-C, и теперь мне нужно зашифровать данные для моего iOS-приложения из Javascript. Но этот простой тест не проходит...

<script type="text/javascript" src="js/utils/sjcl.js"></script>
<script type="text/javascript" src="js/utils/rncryptor.js"></script>

function testEncodeEncrypt_RN(plaintext) {
    var secret = "rosebud";
    var encrypted = RNCryptor.Encrypt(secret, plaintext);
    var decrypted = RNCryptor.Decrypt(secret, encrypted);
    console.log("decrypted to " + decrypted);
}

... с ошибкой "Uncaught CORRUPT: pkcs # 5, заполнение повреждено", выданной sjcl.js.

Я пробовал разные объекты опций, но я считаю, что ни одна опция не должна работать ни для Encrypt, ни для Decrypt. Изменение входной строки и секрета также не принесут пользы. Есть идеи?

1 ответ

Решение
/*
  Takes password string and plaintext bitArray
  options:
    iv
    encryption_salt
    html_salt
  Returns ciphertext bitArray
*/
RNCryptor.Encrypt = function(password, plaintext, options) {

Является plaintext битовый массив? Если вы передаете строку UTF-8, вам необходимо преобразовать ее с помощью sjcl.codec.utf8String.toBits, Есть также кодеки для кодирования hex и base64. Смотрите документы SJCL.

Последние версии SJCL будут принимать строки и автоматически конвертировать их в bitArrays, но, вероятно, я сам больше не буду касаться реализации JS, пока не закончу работу над форматом v4 (должно быть до конца 2015 года). Я рад принять запросы на получение ответа.

Обратите внимание, что RNCryptor-js не полностью совместим ни с одной из других реализаций (включая реализацию ObjC). JavaScript слишком медленный для обработки 10 000 итераций PBKDF2, необходимых для формата v3, поэтому по умолчанию используется 1000. Это означает, что вы должны изменить код на другой стороне для соответствия (или настроить JS для использования 10 000, но для обработки паролей потребуется 10 раз больше). Искать два .rounds настройки конфигурации в RNCryptor.h,

Одна из основных целей формата v4 - сделать число итераций настраиваемым, чтобы сделать JavaScript способным к взаимодействию (к сожалению, за счет значительного снижения безопасности шифрования, но это все, что JavaScript может обрабатывать сегодня).

Другие вопросы по тегам