Delphi:XOR,HEX,加密

时间:2011-07-31 09:23:09

标签: delphi encryption hex xor

有没有办法用XOR加密并用HEX表示(反之)。 (我想不是,找不到)。

还有其他选择吗?我不想使用Base64。

所以我需要以可读的形式加密和表示结果。

4 个答案:

答案 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位输入,因此您可以使用另一个函数生成更长的掩码阵列以提高安全级别。