首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Delphi: XOR,HEX,encryption

Delphi: XOR,HEX,encryption
EN

Stack Overflow用户
提问于 2011-07-31 17:23:09
回答 4查看 7.2K关注 0票数 0

有没有一种方法可以用XOR加密,并用十六进制表示(反之亦然)。(我想没有,找不到)。

有没有别的选择?我不想使用Base64。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-31 20:00:09

下面的函数对字符串进行XOR运算,然后以十六进制的形式返回结果:

代码语言:javascript
复制
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字符串。

票数 1
EN

Stack Overflow用户

发布于 2017-02-10 13:56:13

所有人都指出xor加密有多弱,但你们都只想到使用单个值进行xor。相反,您可以轻松地将一个字符串与另一个字符串-键-进行异或。密钥越长,实际加密就越强,如果密钥足够长,就很难破解。

您甚至可以对内存流进行xor加密,就像对字符串进行xor加密一样:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2011-07-31 17:59:16

XOR加密被称为Stream Cypher,你可以谷歌搜索不同的版本。

将字节数组转换为十六进制只需用字节0x00到0x0F的零填充来表示基数为16的每个字节。

你对这两个问题到底有什么问题?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6888582

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档