2013-09-26 53 views
-1

我在我的項目中使用crypto api WCrypt2 for md5 crypt但我不知道解碼。你能給我提供加密API的解碼功能嗎?delphi crypto api decode

在我的項目中,我需要從波紋管使用此加密代碼。 DECODE函數必須與label1和Edit1.Bouth工作包括在形式啓動,但對於解碼,我將使用Button1的

這裏是我的代碼:

unit HUID; 

interface 

uses 
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
    Dialogs, StdCtrls, IdGlobal, IdHash, IdHashMessageDigest, WCrypt2; 

type 
    TForm1 = class(TForm)   
    Edit1: TEdit; 
    Label1: TLabel; 
    Button1: TButton; 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    Form1: TForm1; 

implementation 

{$R *.dfm} 

function GetEnvVarValue(const VarName: string): string; 
var 
    BufSize: Integer; // buffer size required for value 
begin 
    // Get required buffer size (inc. terminal #0) 
    BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0); 
    if BufSize > 0 then 
    begin 
    // Read env var value into result string 
    SetLength(Result, BufSize - 1); 
    GetEnvironmentVariable(PChar(VarName), 
    PChar(Result), BufSize); 
    end 
    else 
    // No such environment variable 
    Result := ''; 
end; 

function md5(const Input: string): string; 
var 
    i: Integer; 
    pbContent: PByte; 
    dwHashBytes: Cardinal; 
    hHash: HCRYPTHASH; 
    hCryptProvider: HCRYPTPROV; 
    bHash: array[0..$7f] of Byte; 
begin 
    Result := ''; 
    dwHashBytes := 16; 
    pbContent := Pointer(PChar(Input)); 

    if CryptAcquireContext(@hCryptProvider, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT or CRYPT_MACHINE_KEYSET) then 
    begin 
    if CryptCreateHash(hCryptProvider, CALG_MD5, 0, 0, @hHash) then 
    begin 
     if CryptHashData(hHash, pbContent, Length(Input) * sizeof(Char), 0) then 
     begin 
     if CryptGetHashParam(hHash, HP_HASHVAL, @bHash[0], @dwHashBytes, 0) then 
     begin 
      for i := 0 to dwHashBytes - 1 do 
      begin 
      Result := Result + Format('%.2x', [bHash[i]]); 
      end; 
     end; 
     end; 
     CryptDestroyHash(hHash); 
    end; 
    CryptReleaseContext(hCryptProvider, 0); 
    end; 
    Result := AnsiLowerCase(Result); 
end; 

procedure TForm1.FormCreate(Sender: TObject); 
begin 
    Label1.Caption := (GetEnvVarValue('PROCESSOR_REVISION')+GetEnvVarValue('PROCESSOR_LEVEL')+GetEnvVarValue('NUMBER_OF_PROCESSORS')+GetEnvVarValue('Cor_Debugging_Control_424242')); 
    Edit1.Text := md5(Label1.Caption); 
end; 

end. 
+9

MD5是一種單向散列算法,它不能被解碼,只能蠻力猜測 –

+2

這是你需要退後一步並仔細看看你真正想要達到的目標。 –

+0

如果Zathrus的評論不夠,請定義「解碼」。 –

回答

4

MD5是一個單向散列。
它用於簽署信息和檢查密碼。

加密
如果您想對數據進行加密(例如安全地發送跨線),您需要使用像AES或3DES的加密。

如果用AES取代MD5調用,解密變得容易。
AES是一個對稱密碼,這意味着加密和解密使用相同的密鑰(儘管不是相同的操作)。

請參見下面的wiki頁面獲取更多信息:

簽約
如果您要使用密碼加密的MD5函數,那麼你」重犯兩次錯誤:

  1. MD5不再安全,請改用SHA2或SHA3。
  2. 你需要鹽,你哈希任何密碼,請參閱:How does password salt help against a rainbow table attack?

爲了使用相同的鹽來檢查您老調重彈一個密碼,並檢查是否相同的結果出來。

+0

使用MD5進行簽名或密碼散列根本不安全。 AES加密和解密操作是不一樣的。 – ntoskrnl

+0

彩虹表不是真的是一個攻擊,而是一個優化你的好蠻力。 –

+0

@FreeConsulting,彩虹表是一種攻擊,因爲它減少了散列到O(1)操作的簡單查找的求解時間。這與將O(x^n)運行時更改爲稍微更好的優化完全不同。 – Johan