导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
2017/11/6 14:25:20
标题:
用网上的aes-ecb加密文件,为嘛解密出来就没法读了呢?
浏览:1253
加入我的收藏
楼主:
//解码函数...001 function AESDecryptFile(InFile,OutFile,Key: string; ResultEncoding: TEncoding = nil; KeyEncoding: TEncoding = nil; KeyBit: TKeyBit = kb128; InitVectorStr: string = ''; APaddingMode: TPaddingMode = TPaddingMode.pmPKCS5or7RandomPadding; CBCMode: Boolean = True; ResultCRLFMode: TCRLFMode = rlCRLF; KeyCRLFMode: TCRLFMode = rlCRLF; OnProcessProc: TOnProcessProc = nil; ProcessProc: TProcessProc = nil): Boolean; var InStream, OutStream: TStringStream; // LStream: TBytesStream; // ImgBytes:TBytes; begin if ResultEncoding = nil then ResultEncoding := TEncoding.UTF8; if KeyEncoding = nil then KeyEncoding := TEncoding.UTF8; InStream := TStringStream.Create('',ResultEncoding, False); InStream.LoadFromFile(InFile); try OutStream := TStringStream.Create('', ResultEncoding, False); try AESDecryptStream(InStream, OutStream, 0, Key, KeyEncoding, KeyBit, InitVectorStr, APaddingMode, CBCMode, KeyCRLFMode, (TEncoding.IsStandardEncoding(ResultEncoding) and (ResultEncoding = TEncoding.Unicode)) or (ResultEncoding is TUnicodeEncoding and not (ResultEncoding is TBigEndianUnicodeEncoding)), OnProcessProc, ProcessProc); OutStream.Position := 0; try OutStream.SaveToFile(OutFile); Result :=true; except Result := False; end; finally FreeAndNil(OutStream); end; finally // FreeAndNil(LStream); FreeAndNil(InStream); end; end; //加密文件 function AESEncryptFile(InFile,OutFile, Key: string; StrEncoding: TEncoding = nil; KeyEncoding: TEncoding = nil; KeyBit: TKeyBit = kb128; InitVectorStr: string = ''; APaddingMode: TPaddingMode = TPaddingMode.pmPKCS5or7RandomPadding; CBCMode: Boolean = True; ValueCRLFMode: TCRLFMode = rlCRLF; KeyCRLFMode: TCRLFMode = rlCRLF; OnProcessProc: TOnProcessProc = nil; ProcessProc: TProcessProc = nil): Boolean; var InStream, OutStream: TStringStream; InContent:string; begin if StrEncoding = nil then StrEncoding := TEncoding.UTF8; if KeyEncoding = nil then KeyEncoding := TEncoding.UTF8; InStream := TStringStream.Create; InStream.LoadFromFile(InFile); try InStream.Position := 0; OutStream := TStringStream.Create('', TEncoding.ANSI, False); try AESEncryptStream(InStream, OutStream, 0, Key, KeyEncoding, KeyBit, InitVectorStr, APaddingMode, CBCMode, KeyCRLFMode, (TEncoding.IsStandardEncoding(StrEncoding) and (StrEncoding = TEncoding.Unicode)) or (StrEncoding is TUnicodeEncoding and not (StrEncoding is TBigEndianUnicodeEncoding)), OnProcessProc, ProcessProc); // Result := GetMemory(OutStream.Size + 1); // Result[OutStream.Size] := #0; // Move(OutStream.Bytes[0], Result[0], OutStream.Size); OutStream.SaveToFile(OutFile); Result := true;//OutStream.Bytes; // TStringStream.Bytes 太长,和实际不符。 // SetLength(Result, OutStream.Size); finally FreeAndNil(OutStream); end; finally FreeAndNil(InStream); end; end;
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 14:28:39
1楼:
是从 sf.net 或 fmx 群下载的最新版本吗? 我看了一下,原本没有文件的啊。 有 Stream 版本啊。 支持 文件流 内存流 字符串流 字节流 等 万能的啊。 关键是你处理文件,何必用字符串流 多余。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/11/6 14:38:05
2楼:
我自己改写的函数...结果发现没用。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 14:49:20
3楼:
加密跟解码出来的文件,不太一样。
此帖子包含附件: 大小: 47.0K
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 14:50:55
4楼:
你用 stringstream 结果处理的内容不是纯文本。你这是活该。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/11/6 15:02:47
5楼:
加密MP3格式也不对啊
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 15:03:48
6楼:
楼主可能眼瞎。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/11/6 16:18:24
7楼:
不给ls扯了...找到参考代码。 http://www.cnblogs.com/ppStudio/p/4209812.html 文件加密用Filestream..
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 16:58:01
8楼:
1 楼 我怕你 不认识英文(其实是我英文差) 我写了 中文流 三个字。 你真没看见? 后来我还质疑你 为啥用 字符串流 stringstream 。你又当没看见。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/11/6 17:13:09
9楼:
还是没用....改用QAES试试... //解码函数...001 function AESDecryptFile(InFile,OutFile,Key: string; ResultEncoding: TEncoding = nil; KeyEncoding: TEncoding = nil; KeyBit: TKeyBit = kb128; InitVectorStr: string = ''; APaddingMode: TPaddingMode = TPaddingMode.pmPKCS5or7RandomPadding; CBCMode: Boolean = True; ResultCRLFMode: TCRLFMode = rlCRLF; KeyCRLFMode: TCRLFMode = rlCRLF; OnProcessProc: TOnProcessProc = nil; ProcessProc: TProcessProc = nil): Boolean; var InF, OutF: TFileStream; begin InF:=nil; OutF:=nil; if ResultEncoding = nil then ResultEncoding := TEncoding.UTF8; if KeyEncoding = nil then KeyEncoding := TEncoding.UTF8; InF:=TFileStream.Create(InFile,fmOpenRead or fmShareDenyWrite); try OutF := TFileStream.Create(OutFile, fmCreate); try AESDecryptStream(InF, OutF, 0, Key, KeyEncoding, KeyBit, InitVectorStr, APaddingMode, CBCMode, KeyCRLFMode, (TEncoding.IsStandardEncoding(ResultEncoding) and (ResultEncoding = TEncoding.Unicode)) or (ResultEncoding is TUnicodeEncoding and not (ResultEncoding is TBigEndianUnicodeEncoding)), OnProcessProc, ProcessProc); Result :=true; finally FreeAndNil(OutF); end; finally // FreeAndNil(LStream); FreeAndNil(InF); end; end; //加密文件 function AESEncryptFile(InFile,OutFile, Key: string; StrEncoding: TEncoding = nil; KeyEncoding: TEncoding = nil; KeyBit: TKeyBit = kb128; InitVectorStr: string = ''; APaddingMode: TPaddingMode = TPaddingMode.pmPKCS5or7RandomPadding; CBCMode: Boolean = True; ValueCRLFMode: TCRLFMode = rlCRLF; KeyCRLFMode: TCRLFMode = rlCRLF; OnProcessProc: TOnProcessProc = nil; ProcessProc: TProcessProc = nil): Boolean; var InF, OutF: TFileStream; begin if StrEncoding = nil then StrEncoding := TEncoding.UTF8; if KeyEncoding = nil then KeyEncoding := TEncoding.UTF8; InF:=TFileStream.Create(InFile,fmOpenRead or fmShareDenyWrite); try InF.Position := 0; OutF := TFileStream.Create(OutFile, fmCreate); try AESEncryptStream(InF, OutF, 0, Key, KeyEncoding, KeyBit, InitVectorStr, APaddingMode, CBCMode, KeyCRLFMode, (TEncoding.IsStandardEncoding(StrEncoding) and (StrEncoding = TEncoding.Unicode)) or (StrEncoding is TUnicodeEncoding and not (StrEncoding is TBigEndianUnicodeEncoding)), OnProcessProc, ProcessProc); Result := true;//OutStream.Bytes; finally FreeAndNil(OutF); end; finally FreeAndNil(InF); end; end;
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 17:15:36
10楼:
能输出文件,可是对加密后的文件解码后成了文件乱码....
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 17:44:07
11楼:
用FlyUtils.AES加密文件后解密文件,产生的文件跟原始文件差异十万八千里...
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 17:53:22
12楼:
你自己差异就差异吧。 别说十万八千里了,就是一个字节,我自己写的都没差异过。 可惜啊,我不喜欢公开我的代码给你。 免费送你一小部分。 procedure TFormMain.Button2Click(Sender: TObject); var KeyBit: TKeyBit; APaddingMode: TPaddingMode; Key: string; begin Key := Edit1.Text; KeyBit := TKeyBit.kb128; if RadioButton192.IsChecked then KeyBit := TKeyBit.kb192; if RadioButton256.IsChecked then KeyBit := TKeyBit.kb256; APaddingMode := TPaddingMode.pmZeroPadding; if CheckBoxPKCS.IsChecked then APaddingMode := TPaddingMode.pmPKCS5or7RandomPadding; AESEncryptFile('In.dat', 'NewOut.dat', Key, TEncoding.ASCII, KeyBit, iv, APaddingMode, CheckBoxCBC.IsChecked, rlCRLF, Process); end; procedure TFormMain.Button3Click(Sender: TObject); var KeyBit: TKeyBit; APaddingMode: TPaddingMode; Key: string; begin Key := Edit1.Text; KeyBit := TKeyBit.kb128; if RadioButton192.IsChecked then KeyBit := TKeyBit.kb192; if RadioButton256.IsChecked then KeyBit := TKeyBit.kb256; APaddingMode := TPaddingMode.pmZeroPadding; if CheckBoxPKCS.IsChecked then APaddingMode := TPaddingMode.pmPKCS5or7RandomPadding; AESDecryptFile('NewOut.dat', 'NewIn.dat', Key, TEncoding.ASCII, KeyBit, iv, APaddingMode, CheckBoxCBC.IsChecked, rlCRLF, Process); end; 经过对 in.dat 和 NewIn.dat 的对比,没有发现问题。
----------------------------------------------
(C)(P)Flying Wang
作者:
2017/11/6 18:42:52
13楼:
已经用QAES解决了
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/6 19:15:36
14楼:
发现用qaes贼简单...使用方法 一,uses单元: uses qaes,qstring; 二,AES-ECB加密文件代码: procedure TForm1.Button1Click(Sender: TObject); var InFile,OutFile:QStringW; AES: TQAES; EnKey:string; AKeyType: TQAESKeyType; begin InFile:='1.txt'; //原文件 outFile:='2.txt';//加密文件 AKeyType := kt128; EnKey:='00567c95d399041fe63a5d03435d1c9d'; AES.AsECB(EnKey, AKeyType); AES.Encrypt(InFile, OutFile); end; 三,AES-ECB解密文件代码: procedure TForm1.Button2Click(Sender: TObject); var InFile,OutFile:QStringW; AES: TQAES; EnKey:string; AKeyType: TQAESKeyType; begin InFile:='2.txt'; //加密文件 outFile:='3.txt'; //解码后文件 AKeyType := kt128; EnKey:='00567c95d399041fe63a5d03435d1c9d'; AES.AsECB(EnKey, AKeyType); AES.Decrypt(InFile, OutFile); end;
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
2017/11/7 9:14:05
15楼:
cnpack,里也有相关加解密方法
----------------------------------------------
-
作者:
2017/11/7 16:52:08
16楼:
我在琢磨如何程序中字符串,先用aes加密一次,然后写入加密字符串做核心字符串..那么OD的时候,跳转到会被欺骗引入aes解码函数,会不会让反编译的人直接疯掉。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。