全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3352
推到 Plurk!
推到 Facebook!

AES加密演算法如何改在Delphi2010編譯

尚未結案
mcho
初階會員


發表:57
回覆:106
積分:42
註冊:2002-11-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-04-21 13:48:12 IP:122.120.xxx.xxx 訂閱
請問版主及大大:
小弟原來在Delph7使用”AES加密演算法”但在Delphi2010無法使用,原始碼如下:請指點!謝謝!

Function GetPassWord(const S1,pa1:String):String;
function HexToString(const S: string): string;
var
i: integer;
begin
Result := '';
// Go throught every single hexadecimal characters, and convert
// them to ASCII characters...
for i := 1 to Length( S ) do
begin
// Only process chunk of 2 digit Hexadecimal...
if ((i mod 2) = 1) then
Result := Result Chr( StrToInt( '0x' Copy( S, i, 2 )));
end;
end;
var
Source: TStringStream;
Dest: TStringStream;
Size: integer;
Key: TAESKey128;
EncryptedText: TStrings;
S: string;
begin
if length(S1) < 20 then
begin
Result := '';
exit;
end;
// Convert hexadecimal to a strings before decrypting...
//S1:= DMMIS.DeptUser.fieldbyname('PASSWORD1').Value;
Source := TStringStream.Create( HexToString(S1));
Dest := TStringStream.Create( '' );
try
// Start decryption...
Size := Source.Size;
//Start := GetTickCount;
Source.ReadBuffer(Size, SizeOf(Size));
// Prepare key...
FillChar(Key, SizeOf(Key), 0);
Move(PChar(Pa1)^, Key, Min(SizeOf(Key), Length(Pa1)));
// Decrypt now...
DecryptAESStreamECB(Source, Source.Size - Source.Position, Key, Dest);
//Stop := GetTickCount;
//Label8.Caption := IntToStr(Stop - Start) ' ms';
//Refresh;
// Display unencrypted text...
//if Sender <> nil then
Result := Dest.DataString
//else
// Edit3.text := Dest.DataString;
finally
Source.Free;
Dest.Free;
end;
end;

function Trans2PassWord(const Pa,pa1:String):String;
function StringToHex(const S: string): string;
var
i: integer;
begin
Result := '';
// Go throught every single characters, and convert them
// to hexadecimal...
for i := 1 to Length( S ) do
Result := Result IntToHex( Ord( S[i] ), 2 );
end;
//AES加密演算法
var Source: TStringStream;
Dest: TStringStream;
Size: integer;
Key: TAESKey128;
KeyWord:string;
begin
//Refresh;
Source := TStringStream.Create( pa );
Dest := TStringStream.Create( '' );
try
// Save data to memory stream...
Size := Source.Size;
Dest.WriteBuffer( Size, SizeOf(Size) );
// Prepare key...
FillChar( Key, SizeOf(Key), 0 );
Move( PChar(Pa1)^, Key, Min( SizeOf( Key ), Length( Pa1 )));
EncryptAESStreamECB( Source, 0, Key, Dest );
//Refresh;
Result := StringToHex( Dest.DataString );
finally
Source.Free;
Dest.Free;
end;
end;
------
何明昌
guimeili2009
一般會員


發表:0
回覆:1
積分:0
註冊:2009-03-25

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-04-21 20:31:02 IP:121.58.xxx.xxx 訂閱
估计改改类型就可以了。
mcho
初階會員


發表:57
回覆:106
積分:42
註冊:2002-11-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-04-27 20:02:16 IP:123.110.xxx.xxx 訂閱
請問類型改那一種類型,請舉例!謝謝!
------
何明昌
編輯記錄
mcho 重新編輯於 2011-04-27 06:04:08, 註解 無‧
Victor4022
中階會員


發表:0
回覆:76
積分:90
註冊:2011-02-20

發送簡訊給我
#4 引用回覆 回覆 發表時間:2011-04-27 23:43:16 IP:122.126.xxx.xxx 訂閱
例如底下的 Move 函式,

[code delphi]
Move(PChar(Pa1)^, Key, Min(SizeOf(Key), Length(Pa1)));
[/code]

Delphi 7 內的PChar = PAnsiChar
Delphi 2009 (或更高) 的 PChar = PWideChar
甚至 TAESKey128 內的結構如果有 Char 型別,可能要調整成 AnsiChar

您可以參考:http://www.google.com.tw/url?sa=t&source=web&cd=4&ved=0CDIQFjAD&url=http://www.sinter.com.tw/downloadpage/200810Delphi2009_short.ppt&ei=x1aoTZnsHIqqvQPCn52ICg&usg=AFQjCNH_jWe18GCEAfC237JmsJaZ3oRcBw



===================引 用 mcho 文 章===================
請問類型改那一種類型,請舉例!謝謝!
ffx132
一般會員


發表:0
回覆:1
積分:0
註冊:2011-05-10

發送簡訊給我
#5 引用回覆 回覆 發表時間:2011-05-10 11:17:18 IP:119.39.xxx.xxx 訂閱
最簡單的方法:直接使用Delphi7編譯為DLL文件。然後在Delphi2010下調用。我升級老項目就是這麼做的。
注意:DLL輸出的函數使用PAnsiChar。
編輯記錄
ffx132 重新編輯於 2011-05-09 21:18:04, 註解 無‧
mcho_60461
一般會員


發表:16
回覆:23
積分:7
註冊:2006-07-31

發送簡訊給我
#6 引用回覆 回覆 發表時間:2011-12-16 00:46:53 IP:58.115.xxx.xxx 訂閱
請問:使用Delphi7編譯為DLL文件,如何編譯為DLL!
可否指導!謝謝!
===================引 用 ffx132 文 章===================
最簡單的方法:直接使用Delphi7編譯為DLL文件。然後在Delphi2010下調用。我升級老項目就是這麼做的。
注意:DLL輸出的函數使用PAnsiChar。
------
mcho
mcho_60461
一般會員


發表:16
回覆:23
積分:7
註冊:2006-07-31

發送簡訊給我
#7 引用回覆 回覆 發表時間:2011-12-22 11:05:16 IP:114.32.xxx.xxx 訂閱
我編成dll 使用時有錯誤的訊息是Invalid pointer operation:如下
unit GetPassWordUt;
interface
uses SysUtils,Classes,ElAES, Math;
Function GetPassWordDll(const S1,pa1:String):AnsiString;
export;
implementation
Function GetPassWordDll(const S1,pa1:String):AnsiString;
function HexToString(const S: string): string;
var
i: integer;
begin
Result := '';
// Go throught every single hexadecimal characters, and convert
// them to ASCII characters...
for i := 1 to Length( S ) do
begin
// Only process chunk of 2 digit Hexadecimal...
if ((i mod 2) = 1) then
Result := Result Chr( StrToInt( '0x' Copy( S, i, 2 )));
end;
end;
var
Source: TStringStream;
Dest: TStringStream;
Size: integer;
Key: TAESKey128;
EncryptedText: TStrings;
S: string;
begin
if length(S1) < 20 then
begin
Result := '';
exit;
end;
Source := TStringStream.Create( HexToString(S1));
Dest := TStringStream.Create( '' );
try
// Start decryption...
Size := Source.Size;
//Start := GetTickCount;
Source.ReadBuffer(Size, SizeOf(Size));
// Prepare key...
FillChar(Key, SizeOf(Key), 0);
Move(PChar(Pa1)^, Key, Min(SizeOf(Key), Length(Pa1)));
// Decrypt now...
DecryptAESStreamECB(Source, Source.Size - Source.Position, Key, Dest);
Result := Dest.DataString
finally
Source.Free;
Dest.Free;
end;
end;
end.
===================引 用 mcho 文 章===================
請問類型改那一種類型,請舉例!謝謝!
------
mcho
系統時間:2024-04-19 3:08:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!