1

我正在尝试使用as3crypto包加密/解密 flex (AIR) 中的文件。问题是,当尝试处理稍微大的文件(超过 5M)时,处理时间变得非常长并且客户端冻结(得到“无响应”标题)所以我尝试去异步并一次加密/解密一个块和将其与帧刷新率交错。

加密进展顺利,或者看起来如此,但是当我尝试将结果解密回原始文档时,我得到一个填充错误:“错误:PKCS#5:unpad:无效填充值。预期 [252],找到 [152 ] "

我的代码是这样的(在启动和完成之间):

  • 重复调用run方法,直到文件完成
  • _缓冲区包含来自源文件的字节数组
  • _结果结果
  • 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);
    
    
    }
    

请帮帮我!

4

2 回答 2

0

..发现错误。

加密和解密操作会改变实际的块大小。在processChunck方法中,加密前的 ByteArray 长度为 16400,之后更改为 16416。使用解密将 ByteArray 长度从 16416 更改回 16400。

因此我选择的解决方案是使用两个数值,每个使用的方法一个。

我不知道为什么会发生这种情况,它不是填充(用Crypto.getPad("none")测试过)。

我将在一两天内将代码发布在我的博客上。( http://giladmanor.com )

于 2010-02-11T21:19:10.613 回答
0

可能值得看看这个http://ria101.wordpress.com/2010/06/04/as3crypto-rsa-padding-function-returned-null-bug-of-death-fix/

于 2010-06-04T16:25:20.143 回答