Ошибка заполнения в as3Crypto при попытке работать асинхронно

Я пытаюсь зашифровать/расшифровать файлы во flex (AIR) с помощью пакета as3crypto. проблема в том, что при попытке обработать немного большие файлы (более 5M) время обработки становится смехотворно долгим, и клиент зависает (получает заголовок «не отвечает»), поэтому я попытался перейти на асинхронный режим и зашифровать/расшифровать фрагмент за раз и чередуйте его с частотой обновления кадров.

шифрование проходит гладко, или так кажется, но когда я пытаюсь расшифровать результат обратно в исходный документ, я получаю ошибку заполнения: "Ошибка: PKCS#5:unpad: Недопустимое значение заполнения. Ожидается [252], найдено [152]"

мой код такой (между инициацией и завершением):

  • метод run вызывается повторно, пока файл не будет завершен
  • _buffer содержит массив байтов из исходного файла
  • _результат результат
  • CHUNK – это размер байтов, которые я обрабатываю каждый раз.
  • шифр инициируется как: Crypto.getCipher("aes-ecb", _key, Crypto.getPad("pkcs5"));

    public function run(data:Object):Boolean{
    
        if((_buffer.length-_position)>CHUNK){
            processChunk(_position,CHUNK);
            _position += CHUNK;
            var e:ProgressEvent = new ProgressEvent(ProgressEvent.PROGRESS,false,false,_position,_buffer.length);
            this.dispatchEvent(e);
            return true;
        }else if(!_isFinnalized){
            processChunk(_position,_buffer.length - _position);
            this.dispatchEvent(new Event(Event.COMPLETE));
            finnalize();
    
        }
    
        return false;
    }
    
    
    private function processChunk(position:uint,chunk:uint):void{
        var buffer:ByteArray = new ByteArray();
        buffer.writeBytes(_buffer,position,chunk);
         if(_action==ENCRYPT){
            _aes.encrypt(buffer);
        }else{
            _aes.decrypt(buffer);
        } 
        _result.writeBytes(buffer);
    
    
    }
    

Помоги мне, пожалуйста!


person Gilad Manor    schedule 11.02.2010    source источник


Ответы (2)


..нашел ошибку.

действия по шифрованию и дешифрованию изменяют фактический размер фрагмента. в методе processChunck длина ByteArray до шифрования была 16400, а после изменена на 16416. Использование расшифровки изменяет длину ByteArray с 16416 обратно на 16400.

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

Я понятия не имею, почему это происходит, это не заполнение (проверено с помощью Crypto.getPad("none")).

Я опубликую код в своем блоге через день или два. (http://giladmanor.com)

person Gilad Manor    schedule 11.02.2010

Возможно, стоит проверить это http://ria101.wordpress.com/2010/06/04/as3crypto-rsa-padding-function-returned-null-bug-of-death-fix/

person The D Williams    schedule 04.06.2010