請教一個加密後解密的問題 |
尚未結案
|
citydog
一般會員 ![]() ![]() 發表:3 回覆:1 積分:0 註冊:2005-07-13 發送簡訊給我 |
以下是加密的function
function encode(keys: integer; data: string): string;
var Pdata:pchar;
len,i:integer;
begin
len:=length(data);
Pdata:=pchar(data);
for i:=0 to len-1 do
begin
pdata[i]:=chr(ord(pdata[i]) xor keys);//加密的keys為隨機產生的一個數值
end;
result:=inttostr(keys) ',' pdata;
end;
以下是解密的Function
Function decode(recevedata:string;len:integer):string;
var Datastring:string;
i,pp:integer;
iPos:integer;
keys:integer;
data:string;
DecodeData:string;
begin
iPos := Pos(',' , recevedata);
len := len - ipos;
if ipos > 0 then
begin
keys:=strtoint(Copy(recevedata, 1, Pos(',', recevedata)-1));
end;
inc(iPos);
data:=Copy(recevedata, iPos, len);
DecodeData:=pchar(data);
for i:=0 to len-1 do
begin
DecodeData[i]:=chr(ord(DecodeData[i]) xor keys);
end;
result:=DecodeData;
end;
現在遇到一個問題,當隨機產生的keys與要加密data字元作xor後有可能會變成空字元。造成接收端收到recevedata再與keys作xor後會造成資料不全的訊息。因為Delphi7解讀一個string的最後一個字元為空字元,所以當加密後如果有空字元產生則空字元後面的其他字元不會被解讀。所以會有傳送字串為'這是一本書'但接收到字串為'這是一'的情況產生。
請各位前輩先進多多指教!提供意見或解決的方法! 發表人 - citydog 於 2005/07/13 22:30:05 發表人 - citydog 於 2005/07/13 22:32:48 發表人 - citydog 於 2005/07/13 22:35:05
|
JustinShen
中階會員 ![]() ![]() ![]() 發表:22 回覆:104 積分:80 註冊:2003-09-20 發送簡訊給我 |
|
deity
尊榮會員 ![]() ![]() ![]() ![]() ![]() ![]() 發表:90 回覆:876 積分:678 註冊:2003-05-09 發送簡訊給我 |
|
aquarius
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
如果你要加密的內容不多, 可以先將加密後的字串轉換為16進位字串來傳遞, 這樣就可以避免變成 ASCII(0) 的問題. 我寫個加密的範例, 解密的部份你自己來吧!!
function encode(keys: integer; data: string): string; var Pdata:pchar; len,i:integer; sNew : string ; begin len:=length(data); Pdata:=pchar(data); sNew:='' ; for i:=0 to len-1 do begin pdata[i]:=chr(ord(pdata[i]) xor keys);//加密的keys為隨機產生的一個數值 sNew:=sNew IntToHex(ord(pdata[i]),2) ;// 轉成 16進位字串 end; result:=inttostr(keys) ',' sNew; end;...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
citydog
一般會員 ![]() ![]() 發表:3 回覆:1 積分:0 註冊:2005-07-13 發送簡訊給我 |
早上看了JustinShen的建議後,到公司試了一下。將程式改成如下就不會有問題了!
function encode(keys: integer; data: string): string;
var
Pdata:pchar;
len,i:integer;
codestr : string ;
begin
codestr:='';
len:=length(data);
Pdata:=pchar(data);
sNew:='' ;
for i:=0 to len-1 do
begin
codestr:=codestr chr(ord(pdata[i]) xor keys);//加密的keys為隨機產生的一個數值
end;
result:=inttostr(keys) ',' codestr;
end;
因為是參考JustinShen的建議,所以解題者就給了JustinShen,也感謝deity、aquarius兩位前輩的幫助!
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |