Delphi: XOR, HEX, шифрование - PullRequest
       23

Delphi: XOR, HEX, шифрование

0 голосов
/ 31 июля 2011

Есть ли способ шифрования с помощью XOR и представления в HEX (и наоборот). (Полагаю, нет, не смог найти это).

Есть ли альтернатива? Я не хочу использовать Base64.

Так что мне нужно зашифровать и представить результат в читаемой форме.

Ответы [ 4 ]

1 голос
/ 10 февраля 2017

все вы указываете, насколько слабым является 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 голос
/ 31 июля 2011

Вот функция, применяющая 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.

0 голосов
/ 31 июля 2011

Использование 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-битный вход, поэтому вы можете с помощью другой функции создать более длинный массив масок для повышения безопасного уровня.

0 голосов
/ 31 июля 2011

XOR-шифрование называется Stream Cypher, вы можете использовать Google для разных версий.

Преобразование байтового массива в шестнадцатеричное - это просто вопрос выражения каждого отдельного байта в базе 16 с заполнением нулями для байтов от 0x00 до 0x0F..

В чем конкретно заключается ваша проблема с любым из них?

...