⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 java,delphi,C#通用des算法delphi实现 需要TurboPower LockBox
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, encddecd,des, StdCtrls, FileCtrl;
const
  BOM_UTF16_LSB: array [0..1] of Byte = ($FF,$FE);
  BOM_UTF16_MSB: array [0..1] of Byte = ($FE,$FF);
  BOM_UTF8: array [0..2] of Byte = ($EF,$BB,$BF);
  BOM_UTF32_LSB: array [0..3] of Byte = ($FF,$FE,$00,$00);
  BOM_UTF32_MSB: array [0..3] of Byte = ($00,$00,$FE,$FF);
//  BOM_UTF7_1: array [0..3] of Byte = ($2B,$2F,$76,$38);
//  BOM_UTF7_2: array [0..3] of Byte = ($2B,$2F,$76,$39);
//  BOM_UTF7_3: array [0..3] of Byte = ($2B,$2F,$76,$2B);
//  BOM_UTF7_4: array [0..3] of Byte = ($2B,$2F,$76,$2F);
//  BOM_UTF7_5: array [0..3] of Byte = ($2B,$2F,$76,$38,$2D);

type
  TEncodingType = (
    etAnsi,       // ANSI   format (SBCS/DBCS)
    etUTF8,       // UTF-8  format
    etUnicode,    // UTF-16 format using little endian
    etUnicodeBE,  // UTF-16 format using big endian
    etUTF32,      // UTF-32 format using little endian
    etUTF32BE     // UTF-32 format using big endian
  );
 TByteOrderMask = array of Byte;

  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Editkey: TEdit;
    Editiv: TEdit;
    Edit1: TEdit;
    Edit2: TEdit;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Memo1: TMemo;
    DirectoryListBox1: TDirectoryListBox;
    FileListBox1: TFileListBox;
    Button8: TButton;
    Button9: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);
  private
    { Private declarations }
    des:tdes;
  public
    { Public declarations }

  end;

var
  Form1: TForm1;

implementation

uses LbCipher;

{$R *.dfm}
function des_Encode(key:array of Byte;iv:array of Byte):string;
begin
end;
procedure TForm1.Button1Click(Sender: TObject);
var
  Encrypt:bool;
  temp,res:String;
  key:TKey64;
  i,j,len,posnum:integer;
  iv:TDESBlock;
  Context : TDESContext;
  poschar:char;
  Block:TDESBlock;
begin
 Encrypt := true;
  temp := Editkey.Text;
    res := '';
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      key[i] :=0
    else
      key[i] := byte(temp[i+1]);
  end;
  temp := Editiv.Text;
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      iv[i]:=0
    else
      iv[i] := byte(temp[i+1]);
  end;
   iv[0]:=18;iv[1]:=52;iv[2]:=86;iv[3]:=120;
   iv[4]:=144;iv[5]:=171;iv[6]:=205;iv[7]:=239;
   InitEncryptDES(Key, Context, Encrypt);
    temp := AnsiToUtf8(edit1.Text);
    len := length(temp);

    temp := temp+ char( 8- (len mod 8));

    posnum := 0;
    for i:=0 to len do begin
      poschar:= temp[i+1];
      Block[posnum] := byte(poschar);
      posnum := posnum +1;
      if posnum = 8 then begin
         EncryptDESCBC(Context, IV, Block);
         for j:= 0 to 7 do begin
           res := res +   char(block[j]);
         end;
         iv := block;
         posnum := 0;
      end;

    end;
    if  posnum <> 0 then begin
      for i:=posnum to 7 do begin
         Block[i] := byte(poschar);
      end;
      EncryptDESCBC(Context, IV, Block);
         for j:= 0 to 7 do begin
           res := res +   char(block[j]);
         end;
         posnum := 0;
    end;
    edit2.Text := EncodeString(res);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  Encrypt:bool;
  temp,res:String;
  key:TKey64;
  i,j,len,posnum:integer;
  iv:TDESBlock;
  Context : TDESContext;
  poschar:char;
  bak,Block:TDESBlock;
begin
  Encrypt := false;
  temp := editkey.Text;
  res := '';
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      key[i] :=0
    else
      key[i] := byte(temp[i+1]);
  end;
  temp := editiv.Text;
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      iv[i] := 0
    else
      iv[i] := byte(temp[i+1]);
  end;
  iv[0]:=18;iv[1]:=52;iv[2]:=86;iv[3]:=120;
  iv[4]:=144;iv[5]:=171;iv[6]:=205;iv[7]:=239;
  InitEncryptDES(Key, Context, Encrypt);
   //for i:=0 to 7 do block[0] := 0;
  temp := DecodeString(edit2.Text)     ;
  posnum := 0;
  for i:=0 to length(temp)-1 do begin
    Block[posnum] := byte(temp[i+1]);
    posnum := posnum+1;
    if posnum = 8 then begin
       bak := block;
       EncryptDESCBC(Context, IV, Block);
       for j:= 0 to 7 do begin
         //  temp := temp+inttostr(byte(block[i]))+' ';
           res := res +   char(block[j]);
       end;
       iv := bak;
      posnum := 0;
    end;
  end;
  if posnum <> 0 then begin
     showmessage('解密出错');
  end else begin
   temp:='';
   //len := res[length(res)] ;
    for i:= 1 to length(res) do begin
      temp := temp+char(res[i]);
    end;
    edit1.Text := Utf8ToAnsi(trim(temp));
   end;

end;
function AnsiLength(const s: string): Integer;
begin
  Result := MultiByteToWideChar(CP_ACP, 0, PAnsiChar(s), -1, nil, 0);
  if Result > 0 then Dec(Result);  // 除去终止符
end;
function AnsiLength1(const s: string): integer;
var
  p, q: PChar;
begin
  Result := 0;
  p := PChar(s);
  q := p + Length(s);
  while p < q do
  begin
    Inc(Result);
    if p^ in LeadBytes then // 当前系统代码页的前导字节数组
      Inc(p, 2)
    else
      Inc(p);
  end;
end;
procedure TForm1.Button3Click(Sender: TObject);
var
  str: string;
begin
  str := '汉字ABC';
  Assert(Length(str) = 7);      // 7个字节
  Assert(AnsiLength(str) = 5);  // 5个字符

end;
procedure CopyBytes(const source: array of Byte; var target: TByteOrderMask);
var
  n: Integer;
  s: array of Byte;
begin
  n := Length(source);
  SetLength(target, n);
  if n > 0 then
  begin
    Move(source[0], target[0], n);
  end;
end;
function TryGetBOM(const encodingType: TEncodingType; var bom: TByteOrderMask): Boolean;
begin
  Result := True;
  case encodingType of
    etUTF8:      CopyBytes(BOM_Utf8, bom);
    etUnicode:   CopyBytes(BOM_UTF16_LSB, bom);
    etUnicodeBE: CopyBytes(BOM_UTF16_MSB, bom);
    etUTF32:     CopyBytes(BOM_UTF32_LSB, bom);
    etUTF32BE:   CopyBytes(BOM_UTF32_MSB, bom);
    else
    begin
      SetLength(bom, 0);
      Result := False;
    end;
  end;
end;
function CompareBOM(pBuffer: PAnsiChar; const bom: array of Byte): Boolean;
var
  i: Integer;
begin
  Result := False;
  for i := Low(bom) to High(bom) do
  begin
    Result := (pBuffer^ <> #0) and (PByte(pBuffer)^ = bom[i]);
    if not Result then Break;
    Inc(pBuffer);
  end;
end;
function DetectEncoding(buffer: PAnsiChar): TEncodingType; overload;
begin
  if CompareBOM(buffer, BOM_UTF8) then
    Result := etUTF8
  else if CompareBOM(buffer, BOM_UTF16_LSB) then
    Result := etUnicode
  else if CompareBOM(buffer, BOM_UTF16_MSB) then
    Result := etUnicodeBE
  else if CompareBOM(buffer, BOM_UTF32_LSB) then
    Result := etUTF32
  else if CompareBOM(buffer, BOM_UTF32_MSB) then
    Result := etUTF32BE
  else
    Result := etAnsi;
end;

function DetectEncoding(stream: TStream): TEncodingType; overload;
var
  pos: Int64;
  bytes: TByteOrderMask;
begin
  SetLength(bytes, 6);
  ZeroMemory(@bytes[0], Length(bytes));
  pos := stream.Seek(0, soFromCurrent);
  stream.Seek(0, soFromBeginning);
  stream.Read(bytes[0], SizeOf(bytes));
  stream.Seek(pos, soFromBeginning);
  Result := DetectEncoding(PAnsiChar(@bytes[0]));
end;
procedure WriteText(stream: TStream; const buffer: WideString;
  const encodingType: TEncodingType; withBom: Boolean = False);
var
  s: AnsiString;
  p: PAnsiChar;
  bom: TByteOrderMask;
  bytes: Integer;
begin
  p := nil;
  bytes := Length(buffer) * SizeOf(WideChar);
  if withBom and TryGetBOM(encodingType, bom) then
  begin
    stream.Write(bom[0], Length(bom));
  end;  
  case encodingType of
    etAnsi:
    begin
      p := PAnsiChar(buffer);
      bytes := Length(buffer);
    end;
    etUTF8:
    begin
      s := Utf8Encode(buffer);
      p := PAnsiChar(s);
      bytes := Length(s);
    end;
    etUnicode:
    begin
      p := PAnsiChar(PWideChar(buffer));
    end;
    etUnicodeBE:
    begin
    //  StrSwapByteOrder(PWideChar(buffer));
      p := PAnsiChar(PWideChar(buffer));
    end;
    else  // 留给读者去实现
    begin
      raise Exception.Create('Not Implemented.');
    end;
  end;
  stream.Write(p^, bytes);
end;


procedure TForm1.Button4Click(Sender: TObject);

begin
  case DetectEncoding(PAnsiChar(AnsiToUtf8('士大夫士大夫'))) of
    etAnsi:
    begin
      edit1.text:= 'Ansi'  ;
    end;
    etUTF8:
    begin
      edit1.text:= 'UTF8'  ;
    end;
    etUnicode:
    begin
     edit1.text:= 'Unicode'  ;
    end;
    etUnicodeBE:
    begin
      edit1.text:= 'UnicodeBE'  ;
    end;
    else  // 留给读者去实现
    begin
      raise Exception.Create('Not Implemented.');
    end;
  end;

end;

procedure TForm1.FormCreate(Sender: TObject);
var
  key:array [0..7] of Byte;
  i,j,len,posnum:integer;
  iv:array [0..7] of Byte;
  temp:String;
begin
temp := Editkey.Text;
  for i:=0 to 7 do begin
    if i > (length(temp)-1) then
      key[i] :=0
    else
      key[i] := byte(temp[i+1]);
  end;
 iv[0]:=18;iv[1]:=52;iv[2]:=86;iv[3]:=120;
   iv[4]:=144;iv[5]:=171;iv[6]:=205;iv[7]:=239;
des:=tdes.Create(key,iv,'gbk2312');
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
  Edit2.Text:=des.Encode(Edit1.Text);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 Edit1.Text:=des.Decode(Edit2.Text);
end;

procedure TForm1.Button7Click(Sender: TObject);
var
  s:TMemoryStream;
begin
  s:=TMemoryStream.Create;
  WriteText(s,'<%@xcSXdsdsadffffffffffffffff',etUTF8,false);
  s.SaveToFile('c:\xxxxxxxxxxxx.jsp');
end;

procedure TForm1.Button8Click(Sender: TObject);
var
 i:integer;
  s:TMemoryStream;
begin


for  i:=0  to FileListBox1.Items.Count-1 do
begin
    s:=TMemoryStream.Create;
   Memo1.Lines.LoadFromFile(FileListBox1.Directory+'\'+ FileListBox1.Items[i]);
   WriteText(s,Memo1.Text,etUTF8,false);
   s.SaveToFile(FileListBox1.Directory+'\'+ FileListBox1.Items[i]);
   s.Free;
end;

end;

procedure TForm1.Button9Click(Sender: TObject);
var
 i:integer;
  s:TMemoryStream;
begin



    s:=TMemoryStream.Create;
    s.LoadFromFile('c:\xxxxxxxxxxxx.jsp');
    DetectEncoding(s);
   s.Free;
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -