首先要确定xml使用了哪些加密方式,这样在As3中就反过来解密。
我加密xml的方式是先将xml文件打包为一个压缩文件,然后将压缩文件进行RC4加密,最后用base64将加密过的压缩包转为base64字符串再将字符串用一个xml保存起来,下面是加密的delphi代码
procedure TConfigController.EncryptXML(xmlPath,saveToFile:WideString); var zipmst:TZipMaster19; tempFile,key:string; xmlDocument:IXMLDocument; rootNode,cdnode:IXMLNode; list:TTntStringList; begin { Zip in to a file } try zipmst:=TZipMaster19.Create(nil); tempFile:=WAddSlash(WideExtractFilePath(xmlPath)) + 'temp.xml'; with zipmst do begin Active:=true; DLLDirectory:=ExtractFilePath(ParamStr(0)); FSpecArgs.Add(xmlPath); ZipFileName:=tempFile; RootDir:=ExtractFilePath(xmlPath); end; zipmst.Add; key := GetKeyString; TRC4Encrypter.EncryptFile(key, tempFile, saveToFile); StreamToBase64(saveToFile); list:=TTntStringList.Create; list.LoadFromFile(saveToFile); xmlDocument:=TXMLDocument.Create(nil); xmlDocument.Active:=true; xmlDocument.Version := '1.0'; xmlDocument.Encoding := 'utf-8'; rootNode:=xmlDocument.AddChild('Data'); cdnode:=xmlDocument.CreateNode(list.Text,ntCData); rootNode.ChildNodes.Add(cdnode); xmlDocument.SaveToFile(saveToFile); DeleteFile(tempFile); finally if Assigned(zipmst) then FreeAndNil(zipmst); if Assigned(list) then FreeAndNil(list); xmlDocument.Active:=false; end; end;
as3解密过程就反过来,下面是as3读取并解密取得真正的xml数据
private function onCompleteHandler(event:Event):void { var xml:XML; if(isEncrypt&&_key.length>0){ xml=XML(event.target.data); // Base64解码 var byteArr:ByteArray=Base64.decode(xml.toString()); byteArr.position=0; byteArr.readUTFBytes(byteArr.length); xml=null; //rc4解码 var keyStr:String=key; keyStr=Hex.fromString(keyStr); var keyArr:ByteArray=Hex.toArray(keyStr); var rc4:ARC4=new ARC4(keyArr); rc4.decrypt(byteArr); rc4.dispose(); keyArr.clear(); var zip:FZip=new FZip(); zip.loadBytes(byteArr); var zipFile:FZipFile=zip.getFileByName('config.xml'); if(zipFile!=null){ var xmlBytes:ByteArray=zipFile.content; xml=XML(xmlBytes.toString()); xmlBytes.clear(); } zip.close(); }else{ xml=XML(event.target.data); } if(xml!=null){ if(_onComplete){ _onComplete.apply(null,[xml]); } }else if(_onError!=null){ _onError.apply(null,["Xml file load fail!"]); } loader.removeEventListener(IOErrorEvent.IO_ERROR,onLoaderIOErrorHandler); loader.removeEventListener(ProgressEvent.PROGRESS,onProgressHandler); loader.removeEventListener(Event.COMPLETE,onCompleteHandler); }