Delphi 7 - 没有足够的实际参数

时间:2015-04-01 13:16:37

标签: delphi delphi-7

我是Delphi 7的新手,也是在这个论坛上,我有疑问。

我已使用Jorlen Young的函数StrToHex - Advanced Encryption Standard (AES) Interface Unit v1.3成功将网址字符串转换为十六进制!。

但是,当我实现他的函数EncryptString 时,我的代码底部出现错误:加密:= EncryptString('www.website.com'); 带有以下消息:

[Hint] Unit1.pas(xx): Variable 'st' is declared but never used in 'EncryptString'
[Error] Unit1.pas(xx): Not enough actual parameters
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

您能否给我一些关于如何在我的语法中实现“Key”和“KeyBit”选项的提示:加密:= EncryptString('www.website.com');

我将不胜感激。

...这是我的代码:

    .....................
    .....................

type
  TKeyBit = (kb128, kb192, kb256);
    .....................
    .....................
    procedure IdMappedPortTCP1Execute(AThread: TIdMappedPortThread);

  private
    { Private declarations }
  public
{ Public declarations }
  end;

implementation

function StrToHex(Const str: Ansistring): Ansistring;
asm
    push ebx
    push esi
    push edi
    test eax,eax
    jz   @@Exit
    mov  esi,edx
    mov  edi,eax
    mov  edx,[eax-4]
    test edx,edx
    je   @@Exit      {Length(S) = 0}
    mov  ecx,edx
    Push ecx
    shl  edx,1
    mov  eax,esi
    {$IFDEF VER210}
    movzx ecx, word ptr [edi-12]
    {$ENDIF}
    call System.@LStrSetLength
    mov  eax,esi
    Call UniqueString
    Pop   ecx
  @@SetHex:
    xor  edx,edx
    mov  dl, [edi]
    mov  ebx,edx
    shr  edx,4
    mov  dl,byte ptr[edx+@@HexChar]
    mov  [eax],dl
    and  ebx,$0F
    mov  dl,byte ptr[ebx+@@HexChar]
    inc  eax
    mov  [eax],dl
    inc  edi
    inc  eax
    loop @@SetHex
  @@Exit:
    pop  edi
    pop  esi
    pop  ebx
    ret
  @@HexChar: db '0123456789ABCDEF'
end;

function EncryptString(Value: AnsiString; Key: AnsiString; KeyBit: TKeyBit = kb128): AnsiString;
var
  {$IFDEF VER210}
  SS,DS: TMemoryStream;
  {$ELSE}
  SS, DS: TStringStream;
  {$ENDIF}
  Size: Int64;
  AESKey128: TAESKey128;
  AESKey192: TAESKey192;
  AESKey256: TAESKey256;
  st: AnsiString;
begin
  Result := '';
  {$IFDEF VER210}
    ss := TMemoryStream.Create;
    SS.WriteBuffer(PAnsiChar(Value)^,Length(Value));
    DS := TMemoryStream.Create;
  {$ELSE}
    SS := TStringStream.Create(Value);
    DS := TStringStream.Create('');
  {$ENDIF}
  try
    Size := SS.Size;
    DS.WriteBuffer(Size, SizeOf(Size));
    if KeyBit = kb128 then
    begin
      FillChar(AESKey128, SizeOf(AESKey128), 0 );
      Move(PAnsiChar(Key)^, AESKey128, Min(SizeOf(AESKey128), Length(Key)));
      EncryptAESStreamECB(SS, 0, AESKey128, DS);
    end;
    if KeyBit = kb192 then
    begin
      FillChar(AESKey192, SizeOf(AESKey192), 0 );
      Move(PAnsiChar(Key)^, AESKey192, Min(SizeOf(AESKey192), Length(Key)));
      EncryptAESStreamECB(SS, 0, AESKey192, DS);
    end;
    if KeyBit = kb256 then
    begin
      FillChar(AESKey256, SizeOf(AESKey256), 0 );
      Move(PAnsiChar(Key)^, AESKey256, Min(SizeOf(AESKey256), Length(Key)));
      EncryptAESStreamECB(SS, 0, AESKey256, DS);
    end;
    {$IFDEF VER210}
      SetLength(st,Ds.Size);
      DS.Position := 0;
      DS.ReadBuffer(PAnsiChar(st)^,DS.Size);
      Result := StrToHex(st);
    {$ELSE}
      Result := StrToHex(DS.DataString);
    {$ENDIF}
  finally
    SS.Free;
    DS.Free;
  end;
end;

procedure TForm1.IdMappedPortTCP1Execute(AThread: TIdMappedPortThread);
var Payload, Encrypt:String;
begin

Encrypt := EncryptString('www.website.com');

  if Pos('CONNECT',AThread.NetData)<>0 then
    begin
      if host.Text = 'Operator' then
        begin
           Athread.OutboundClient.Write(Athread.NetData+#13#10);
           Payload := 'GET http://'+Encrypt+'/ HTTP/1.1'+#13#10;
           Athread.NetData:= Athread.NetData+Payload;
        end;
    end;
end.

干杯, RZV

1 个答案:

答案 0 :(得分:0)

EncryptString有2个必需参数和一个可选参数。您至少需要提供密钥。