2010-08-28 23 views
0

我正在製作一個程序來實現xor加密,同時玩弄我的程序我輸入了各種組合鍵該程序完美運行,直到我輸入密鑰的值: 904932這引起了'd'字符的省略,例如,如果我在edit1中輸入'你好,我的名字是dexter,我討厭我的愚蠢妹妹dede',加密和解密將返回 使我的edit1文本:'你好我的名字是exter我恨我的stupi姐姐ee' 發生了什麼事?xor加密:將密鑰的設置值設置爲904932吃掉'd'

procedure TForm2.Button1Click(Sender: TObject); 
    var 
    c:char; 
    i,key: integer; 
    begin 
     s := edit1.Text; 
     edit1.Text := #0; 
     key := strtoint(edit2.text); 
     key := key + 128;//i am adding 128 so that i dont get NULL char 
     for I := 1 to length(s) do {or 0 to lenght(s)? i dont know} 
     begin 
     c := s[i]; 
     c := char(ord(c) xor key); 
     edit1.Text := edit1.Text + c; 
     end; 
    end; 
+2

使用鍵:= strtoint(edit2.text)和$ 7F + 128; - 它將解決ASCII字符串的NULL問題。 – kludg 2010-08-28 16:24:49

回答

5

添加128將無法解決您的問題。它只是移動它。

您的「異或密鑰」只是異或密鑰的最後一個字節,即您的情況下爲904932的$ E4。 $ E4 + 128將四捨五入(即-256)爲字節值100,即ASCII 「d」的值。 這就是爲什麼你的「d」消失了。

所以我想不應該使用這種異或算法,如果你想顯示加密文本。 我建議你做一些簡單的置換算法。

+0

這一點是一個整數是4個字節,而這種情況下的字符顯然是一個字節。所以OP必須使用D2009之前的版本。 D2009 +會爲這個角色使用兩個字節,而不會顯示出問題,或者它會以另一種方式表現出來。 – 2010-08-28 15:55:17

+2

D2009 +版本將顯示相同的問題,只是舍入偏移量爲65536而不是256,因爲密鑰是32位整數。所以關鍵數字將是另一個,但很容易猜到,例如65508將刪除相同的'd'字符,因爲65508 = 65536-128 + 100。 – 2010-08-28 17:18:09

+0

謝謝你回答我的問題,我仍然有一些混淆:'你的'異或鍵'只是異或你的關鍵字的最後一個字節''爲什麼異或只是異或鍵的最後一個字節是什麼原因以及如何克服它(如果可能)''所以我想不應該使用這樣一個xor算法,如果你想顯示加密文本''那麼爲什麼互聯網充滿xor加密的例子? – 2010-08-29 07:50:48

1

它是使用XOR即使最終字符是#0沒有問題,因爲$00 xor $E4 = $E4揭示原始字符。問題是你使用加密結果作爲處理#0的字符串。如果你指定加密字符串爲字節數組,你應該沒問題。如果要顯示它,請使用BinToHex或一系列IntToHex。

1

這是您的修訂。

procedure TForm2.Button1Click(Sender: TObject); 
var 
    i,key: integer; 
begin 
    s := edit1.Text; 
    edit1.Text := ''; 
    key := strtoint(edit2.text); 
    if Key = 0 then //replacement for the +128 
    Key := 128 
    for I := 1 to length(s) do //string are 1 indexed. Dynamic arrays 0 indexed. 
    begin 
    s[i] := char(s[i] xor key); 
    end; 
    edit1.Text := S; //Much faster to assign a full string than to assign character by character. 
        //Also, this might fix your vanishing "d" problem. 
        //I didn't test it, but I suspect that 
        //edit1.Text + c might result in no change if c=#0 
end; 
+0

它不會按預期工作,例如,如果字符ASCII碼匹配鍵值(字節轉換),它將存儲#0。這是一個問題。 – 2010-09-01 07:55:20

+0

它可能不會正確顯示,是的。但是,如果「S」被正確操作,它應該按預期工作。但是,再一次,我們加密字符串的存儲目的,而不是顯示。當然,如果目的是顯示,那麼只有很少的加密算法可以完成,除非你轉換成Base64。但是,XOR加密完全有效。 – 2010-09-01 20:25:19

2

其實,我建議使用現代密碼如AES-CBC,但如果你想與復古加密玩,然後讓這裏有一番情趣。由於你的加密輸出是文字,我可能會建議使用加法模而不是XOR。處理字節時僅使用XOR,而不是字符。您需要避免輸出中出現某些特殊字符。在這種情況下,你似乎遇到了NULL字符的問題。通過定義字符集可以避免輸出字符。
例如,您可能只想使用ASCII值1到127範圍內的字符(除NULL外的所有ASCII字符)。這意味着基數爲1,模數爲126 =(127 - 1)

要編碼一個字符,首先要減去基數。添加鍵值。然後,得到模數結果。最後,在加入鹼背面

小寫字母d的十進制值是100。
100 - 1 = 99 //減去基
99 + 904932 = 905031 //添加密鑰值,這裏使用你的
905031%126 = 99 //模量結果洛爾904932%126 = 0
99 + 1 = 100 //添加鹼回

由於您的密鑰值是由模數126的輸出整除等於輸入。

撤消加法模是一個稍微不同的過程。
100 - 1 = 99 //減去基
99 - 904932 = -904833 //減去密鑰值
-904833%126 = -27 //模量導致
126 + -27 = 99 //添加模的模結果
99 + 1 = 100 //加入鹼回

您可以設置模量要包括儘可能多的字符,只要你想進入你的字符集爲高,並與一些奇特的數學可以以任何方式將字符映射到整數值。

雖然我確實說過你可以用任何你想要的方式來映射角色,但事實是,你受到媒體文本寫入的限制。您不能將模數設置爲高於媒體可以承載的所有字符的總數,但可以爲編碼值和解碼值分別設置字符映射。

我還會評論您的關鍵值選擇。將相同的鍵值應用於所有字符是關於最弱的可能形式的加密。 (ROT13真的可以被認爲是加密嗎?)想出一些方法來改變每個角色的鍵值。當使用這種類型的加密時,完成的某些操作是爲每個字符遞增一個值,或者將已處理字符的值添加到該鍵。

+0

似乎有趣的感謝 – 2010-09-17 13:04:41