我正在尝试使用 as3crypto 包在flex(AIR)中加密/解密文件。 问题是,当尝试处理稍大的文件(超过5M)时,处理时间变得非常长,客户端冻结(获得“无响应”标题) 所以我试着去Async并一次加密/解密一个块,并用帧刷新率交织它。
加密变得顺畅,或者看起来如此,但是当我尝试将结果解密回原始文档时,我得到填充错误: “错误:PKCS#5:unpad:无效的填充值。预期[252],找到[152] ”
我的代码是这样的(在启动和完成之间):
密码启动为: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);
}
答案 0 :(得分:0)
..发现了这个错误。
加密和解密操作会更改实际的块大小。 在 processChunck 方法中,加密前的ByteArray长度为16400,更改为16416之后。 使用decrypt将ByteArray长度从16416更改回16400。
因此我选择的解决方案是使用两个数值,每个方法使用一个。
我不知道为什么会这样,它不是填充(用 Crypto.getPad(“无”)进行测试)。
我会在一两天内在我的博客上发布代码。 (http://giladmanor.com)
答案 1 :(得分:0)