線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1252
推到 Plurk!
推到 Facebook!

請教一個加密後解密的問題

尚未結案
citydog
一般會員


發表:3
回覆:1
積分:0
註冊:2005-07-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-13 22:06:41 IP:59.104.xxx.xxx 未訂閱
以下是加密的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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-14 01:03:02 IP:222.93.xxx.xxx 未訂閱
我对加密解密的问题很感兴趣 我看您的问题在于使用Pchar的问题,如果不要使用这个问题应该会解决,实际上正是Pchar处理时将空字元作为字符串结尾的缘故。 Justin Shen ================================= 如果能帮到您,我会很开心;如果能得到您的帮助,是我的荣幸 =================================
------
====================
我为一切作努力!
Justin Shen

deity
尊榮會員


發表:90
回覆:876
積分:678
註冊:2003-05-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-14 08:50:50 IP:218.15.xxx.xxx 未訂閱
citydog您好: 参考: http://delphi.ktop.com.tw/topic.php?TOPIC_ID=74022 里有几种其他的加密方法,简洁且有范例,试试看 <> ============================ 为什么经过多年以后,得失的过程如此冷漠 ============================
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-14 12:37:01 IP:210.243.xxx.xxx 未訂閱
如果你要加密的內容不多, 可以先將加密後的字串轉換為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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-14 19:14:11 IP:59.104.xxx.xxx 未訂閱
早上看了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兩位前輩的幫助!
系統時間:2024-06-30 11:00:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!