2011-07-31 48 views
-1

有沒有一種方法來加密與XOR和十六進制(和相反)。 (我想不是,找不到)。德爾福:異或,十六進制,加密

是否有替代方案?我不想使用Base64。

所以我需要加密和代表在一個可讀的形式的結果。

+2

Base64是爲這種類型的事情中最常見的編碼。用於加密的純XOR不是一個好主意(不安全)。請更清楚地說明你的問題 - 我很難判斷你是什麼。 – Mat

+0

調用異或加密是有點拉伸。 base64有什麼問題?你的輸入是什麼格式? –

+0

你期待哪種輸入數據?串? rawbytestring?內存指針?在哪個版本的Dephi上? –

回答

1

這裏是應用XOR爲字符串的函數,然後返回結果爲十六進制:

function XorToHex(const Source: string; Code: char): string; 
const 
    HexChars: array[0..15] of char = 'ABCDEF'; 
var i: Integer; 
    c: Integer; 
begin 
    SetLength(Result,Length(Source)*(sizeof(char)*2)); 
    for i := 1 to Length(Source) do begin 
    c := Ord(Source[i]) xor Ord(Code); 
    {$IFDEF UNICODE} 
    result[i*4-3] := HexChars[(c and 7) shr 4]; 
    result[i*4-2] := HexChars[(c and 7) and 15]; 
    c := c shr 8; 
    result[i*4-1] := HexChars[c shr 4]; 
    result[i*4] := HexChars[c and 15]; 
    {$ELSE} 
    result[i*2-1] := HexChars[c shr 4]; 
    result[i*2] := HexChars[c and 15]; 
    {$ENDIF} 
    end; 
end; 

這種基本的XOR是不強的。猜測關鍵代碼非常簡單,只有一個Char。

但是這個功能將與Unicode和不Unicode字符串工作。

+2

我不喜歡'* {$ IFDEF UNICODE} 4 {$ ELSE} 2 {$ ENDIF}'部分。正確的方法是:* SizeOf(Char)* 2',IMO。這也被摺疊成一個不變的,但更好的可讀性。 –

+0

爲什麼不使用內置的轉換函數? –

+0

@Rudy你說得對。我已經糾正了這一點。我直接在SO中編寫了這個函數。 –

0

XOR加密被稱爲流Cypher支架,你可以爲谷歌不同的版本。

轉換一個字節數組十六進制僅僅是一個零填充字節爲0×00爲0x0F表達在基座16的每個單獨的字節的物質。

究竟是什麼問題?

+2

雖然簡單的異或可以稱爲流密碼,但流密碼是一個更廣泛的概念 - 它是一類密碼,不僅是XOR。例如流行的RC4算法是流密碼。 – kludg

+0

而RC4也是XOR密碼。 RC4引擎生成與明文異或的密鑰流以產生密文。 – rossum

+0

我不喜歡將流密碼稱爲XOR密碼的想法。流密碼不是強制使用XOR,它只是流密碼的一種最常見的形式。流密碼是關於生成一個僞隨機比特流,使用異或是一個實現細節。 – kludg

0

使用XOR加密二元函數是窮人的加密。它簡單而快速,但很容易找到編碼掩碼鍵。

這裏你在那簡單的測試案例:

program Projecth1; 
{$APPTYPE CONSOLE} 
uses SysUtils; 

var 
    Mask :cardinal = $12345678; 
    n  :cardinal; 
begin 
    n := $11223344; 
    writeln('input: $' + IntToHex(n, 8)); 
    n := n xor Mask; 
    writeln('encode: $' + IntToHex(n, 8)); 
    n := n xor Mask; 
    writeln('decode: $' + IntToHex(n, 8)); 
    readln; 
end. 

這個測試用例只使用32位掩碼位和32位輸入,這樣你就可以與其他功能不再遮罩陣列生成提高安全水平。

0

大家指出多麼虛弱的XOR加密,但您可以用一個價值都只認爲是由異或運算。相反,你可以用另一個字符串 - 一個鍵很容易地對字符串進行異或。密鑰越長,實際的加密越強,並且密鑰足夠長,就很難破解。

你甚至可以XOR加密內存流,就像您的字符串:

Procedure XorStream(const StreamToXor: TMemoryStream; const XorKey: string); 
    var 
    i,k : int64; 
    PC : PChar; 
    begin 
    if(StreamToXor=nil)then exit; 
    if(StreamToXor.Size<1)then exit; 
    if(XorKey='')then exit; 
    PC := StreamToXor.Memory; 
    k := 0; 
    for i:=0 to StreamToXor.Size-1 do 
     begin 
      inc(k); if(k>Length(XorKey))then k := 1; 
      PC[i] := char(byte(PC[i]) xor byte(XorKey[k])); 
     end; 
    end;