-1

私のプロジェクトでは、md5 crypt の crypto api WCrypt2 を使用していますが、デコードする方法がわかりません。crypto api のデコード機能を教えてください。

私のプロジェクトでは、以下の暗号化コードを使用する必要があります。デコード機能は、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.
4

1 に答える 1

4

MD5 は一方向ハッシュです。
情報の署名とパスワードの確認に使用されます。

暗号
化 データを暗号化する場合 (たとえば、ネットワーク上で安全に送信する場合)、AES や 3DES などの暗号を使用する必要があります。

MD5 呼び出しを AES 復号化に置き換えると、簡単になります。
AES は対称暗号です。つまり、暗号化と復号化で同じキーが使用されます (ただし、同じ操作ではありません)。

詳細については、次の wiki ページを参照してください。

署名
パスワードの暗号化に MD5 機能を使用する場合は、次の 2 つの間違いを犯しています。

  1. MD5 はもはや安全ではありません。代わりに SHA2 または SHA3 を使用してください。
  2. ハッシュしたパスワードはすべてソルトする必要があります。次を参照してください:パスワードソルトはレインボーテーブル攻撃に対してどのように役立ちますか?

パスワードを確認するには、同じソルトを使用してパスワードを再ハッシュし、同じ結果が得られるかどうかを確認します。

于 2013-09-26T17:46:09.367 に答える