DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 28
在线用户: 16
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
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;
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/6 14:28:39
1楼: 是从 sf.net 或 fmx 群下载的最新版本吗?
我看了一下,原本没有文件的啊。
有 Stream 版本啊。
支持 文件流 内存流 字符串流 字节流 等 万能的啊。

关键是你处理文件,何必用字符串流 多余。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/11/6 14:38:05
2楼: 我自己改写的函数...结果发现没用。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/11/6 14:49:20
3楼: 加密跟解码出来的文件,不太一样。
此帖子包含附件:
PNG 图像
大小:47.0K
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/6 14:50:55
4楼: 你用 stringstream 结果处理的内容不是纯文本。你这是活该。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/11/6 15:02:47
5楼: 加密MP3格式也不对啊
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/6 15:03:48
6楼: 楼主可能眼瞎。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/11/6 16:18:24
7楼: 不给ls扯了...找到参考代码。
http://www.cnblogs.com/ppStudio/p/4209812.html

文件加密用Filestream..
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/11/6 16:58:01
8楼: 1 楼 我怕你 不认识英文(其实是我英文差) 我写了 中文流 三个字。
你真没看见?

后来我还质疑你 为啥用 字符串流 stringstream 。你又当没看见。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
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;
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/11/6 17:15:36
10楼: 能输出文件,可是对加密后的文件解码后成了文件乱码....
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/11/6 17:44:07
11楼: 用FlyUtils.AES加密文件后解密文件,产生的文件跟原始文件差异十万八千里...
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
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
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/11/6 18:42:52
13楼: 已经用QAES解决了
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
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;
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
作者:
男 luwakin (luwakin) ★☆☆☆☆ -
普通会员
2017/11/7 9:14:05
15楼: cnpack,里也有相关加解密方法
----------------------------------------------
-
作者:
男 letianwuji (大器晚成) ▲▲▲▲▲ -
普通会员
2017/11/7 16:52:08
16楼: 我在琢磨如何程序中字符串,先用aes加密一次,然后写入加密字符串做核心字符串..那么OD的时候,跳转到会被欺骗引入aes解码函数,会不会让反编译的人直接疯掉。
----------------------------------------------
相信自己,若自己都不相信,那还有谁可信。
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行85.9375毫秒 RSS