有没有一种方法可以用XOR加密,并用十六进制表示(反之亦然)。(我想没有,找不到)。
有没有别的选择?我不想使用Base64。
所以我需要加密并以可读的形式表示结果。
发布于 2011-07-31 20:00:09
下面的函数对字符串进行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根本就不强。很容易猜到密钥码,它只有一个字符。
但是这个函数可以处理Unicode字符串,而不是Unicode字符串。
发布于 2017-02-10 13:56:13
所有人都指出xor加密有多弱,但你们都只想到使用单个值进行xor。相反,您可以轻松地将一个字符串与另一个字符串-键-进行异或。密钥越长,实际加密就越强,如果密钥足够长,就很难破解。
您甚至可以对内存流进行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;发布于 2011-07-31 17:59:16
XOR加密被称为Stream Cypher,你可以谷歌搜索不同的版本。
将字节数组转换为十六进制只需用字节0x00到0x0F的零填充来表示基数为16的每个字节。
你对这两个问题到底有什么问题?
https://stackoverflow.com/questions/6888582
复制相似问题