回答
這裏是應用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字符串工作。
我不喜歡'* {$ IFDEF UNICODE} 4 {$ ELSE} 2 {$ ENDIF}'部分。正確的方法是:* SizeOf(Char)* 2',IMO。這也被摺疊成一個不變的,但更好的可讀性。 –
爲什麼不使用內置的轉換函數? –
@Rudy你說得對。我已經糾正了這一點。我直接在SO中編寫了這個函數。 –
XOR加密被稱爲流Cypher支架,你可以爲谷歌不同的版本。
轉換一個字節數組十六進制僅僅是一個零填充字節爲0×00爲0x0F表達在基座16的每個單獨的字節的物質。
究竟是什麼問題?
使用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位輸入,這樣你就可以與其他功能不再遮罩陣列生成提高安全水平。
大家指出多麼虛弱的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;
- 1. 將十六進制str轉換爲十進制值在德爾福
- 2. DES使用十六進制密鑰python的加密和解密十六進制
- 3. 如何在AES加密中使用十六進制十六進制密鑰?
- 4. 使用十進制或十六進制
- 5. 加十六進制
- 6. AES加密輸出十六進制vb.net
- 7. ASP.NET加密十六進制字符
- 8. SQLCipher Android和十六進制加密
- 9. 德爾福2010密碼庫
- 10. 德爾福加密綱要5.2 VS奇爾卡特加密
- 11. 德爾福的免費加密庫
- 12. 德爾福加密將Java代碼
- 13. 德爾福壓縮和加密
- 14. 德爾福/ PHP LockBox加密AES ECB
- 15. 德爾福DEC庫(Rijndael算法)加密
- 16. 加密字符串從德爾福C#
- 17. 德爾福加密箱散列
- 18. 十六進制串&十六進制
- 19. Android WifiManager - 以十六進制或不以十六進制
- 20. 德爾福TPair異常
- 21. 德爾福6 - >德爾福2006年dbexpress怪異?
- 22. 二進制到Base64(德爾福)
- 23. 德爾福掩碼的二進制數
- 24. 將十進制轉換爲十六進制和十六進制
- 25. 添加十六進制值以得到十六進制結果
- 26. 解決中的TDataSetProvider德爾福2010年或德爾福2009年
- 27. 德爾福v.Word - 如何從德爾福
- 28. 德爾福HID Delphi7和德爾福XE2
- 29. 加密很難:AES加密到十六進制
- 30. 十六進制加法C++
Base64是爲這種類型的事情中最常見的編碼。用於加密的純XOR不是一個好主意(不安全)。請更清楚地說明你的問題 - 我很難判斷你是什麼。 – Mat
調用異或加密是有點拉伸。 base64有什麼問題?你的輸入是什麼格式? –
你期待哪種輸入數據?串? rawbytestring?內存指針?在哪個版本的Dephi上? –