有没有办法用XOR加密并用HEX表示(反之)。 (我想不是,找不到)。
还有其他选择吗?我不想使用Base64。
所以我需要以可读的形式加密和表示结果。
答案 0 :(得分:1)
这是一个将XOR应用于字符串的函数,然后将结果返回为十六进制:
function XorToHex(const Source: string; Code: char): string;
const
HexChars: array[0..15] of char = '0123456789ABCDEF';
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字符串。
答案 1 :(得分:1)
所有人都指出xor加密有多弱,但你们都只想到使用单个值来xor。相反,你可以轻松地用另一个字符串x一个字符串 - 一个键。密钥越长,实际加密越强,密钥越长,就越难以破解。
您甚至可以对内存流进行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;
答案 2 :(得分:0)
XOR加密称为Stream Cypher,您可以将Google用于不同版本。
将字节数组转换为十六进制只是表示基数为16的每个字节,对于字节0x00到0x0F的填充为零。
你的问题究竟是什么?
答案 3 :(得分: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位输入,因此您可以使用另一个函数生成更长的掩码阵列以提高安全级别。