2012-12-26 62 views
-1

我已經使用這個簡單的代碼來加密純文本。然後我嘗試使用相同的加密方法解密它,但在加密部分反轉。有一個乘法過程,我不知道如何在解密代碼中對其進行反轉。解密不工作>>>

下面是代碼:

procedure TForm1.Button1Click(Sender: TObject); 
var 
    s: String; 
    count, ilength: Integer; 
begin 
    s := edit1.Text; 
    ilength := Length(s); 
    FOR count := 1 to ilength do 
    begin 
    s[count] := chr(ord(s[count]) * 4 + 1); // Encoding 
    end; 
    Label1.caption := s; 
    // Display encoded text 
    // Decoding section 
    // This will probably be placed in another procedure. 
    FOR count := 1 to ilength do 
    begin 
    s[count] := chr(ord((s[count])/4) - 1); 
    // Here I Get An Error ! Please Help Guys, Thanks 
    end; 
end; 
+2

**錯誤說**是什麼? – SLaks

+5

安全是_hard_。不要發明自己的密碼 – SLaks

+0

@Slaks [DCC錯誤] Unit1.pas(47):E2008不兼容的類型 –

回答

10

您正在嘗試執行整數除法。在Delphi中,你可以使用div/運算符用於浮點除法。看代碼,你正在試圖扭轉這種計算:

ord(s[count]) * 4 + 1 

你扭轉這樣的:

(ord(s[count]) - 1) div 4 

然而,你的算法是行不通的。考慮當你加密64和128時會發生什麼。你乘以4分別得到256和512。然後添加一個獲得257和513.然後,您將存儲回8位數據類型並丟失更高的字節數。所以這兩個字符都編碼爲值1.

我假設您使用的是8位文本。但是,如果您使用的是16位文本,則算法仍然會以完全類似的方式失敗。你提出的算法是不可逆的。

我希望你找到一個現成的加密算法,而不是試圖自己寫。加密很難得到正確的。

+0

如果因子4被奇數所取代,它可以工作,但是,因爲這些是可逆模2^8。但我完全同意你最後一句話。 –

+0

@DavidHeffernan但是你的答案的這部分我想我沒有正確地得到它「可能會考慮當你加密64和128會發生什麼。你乘以4分別得到256和512,然後加一個得到257和513。然後你存儲回8位的數據類型並丟失更高的字節數,所以這兩個字符的值都被編碼爲1. 我假設你使用的是8位文本但是如果你使用的是16位文本「什麼是8位文本和16位文本?我嘗試了大量的數據,並將其完美解密! –

+0

您正在使用哪個版本的Delphi? –

5

您使用/做了分工。這返回一個浮點數。改用DIV來返回一個整數。

+1

@LeonardoHerrera雖然不完整。用'div'代替'/'是不夠的。 –