Функция PHP в функцию Delphi - PullRequest
       0

Функция PHP в функцию Delphi

1 голос
/ 26 января 2011

Я пытаюсь создать PHP-скрипт и Delphi-программу для «общения» с ним. Чтобы обеспечить его безопасность, я хочу зашифровать исходящий текст с обеих сторон, поэтому он использует одинаковую функцию шифрования на обоих концах.

Это функция, которую я нашел для PHP:

function convert($str,$ky=''){
  if($ky=='')return $str;
  $ky=str_replace(chr(32),'',$ky);
  if(strlen($ky)<8)exit('key error');
  $kl=strlen($ky)<32?strlen($ky):32;
  $k=array();
  for($i=0;$i<$kl;$i++){
    $k[$i]=ord($ky{$i})&0x1F;
  }
  $j=0;
  for($i=0;$i<strlen($str);$i++){
    $e=ord($str{$i});
    $str{$i}=$e&0xE0?chr($e^$k[$j]):chr($e);
    $j++;
    $j=$j==$kl?0:$j;
  }
  return $str;
} 

Кажется, я не могу конвертировать его в Delphi. Помощь очень ценится! Спасибо, Джефф

Ответы [ 3 ]

8 голосов
/ 26 января 2011

Это функция, которая получает две строки и возвращает другую строку.Я буду включать объявления переменных в комментарии, так как они представлены в коде;поместите их в верхнюю часть функции.

function convert(str: AnsiString; const key: AnsiString = ''): AnsiString;

Если ключ пуст, то результатом будет просто str:

begin
  if key = '' then
    Exit(str);

Первый параметр - это значение, которое должно быть«зашифровано», а второй - это ключ, который используется для этого шифрования.Длина ключа должна быть не менее восьми непробельных символов;все, что больше 32, игнорируется.Если ключ слишком короткий, PHP-скрипт завершится;вместо этого мы будем использовать оператор Assert Delphi, поскольку ясно, что код никогда не должен был выполняться, даже если ключ неверен.(Завершение сценария не является исправимой ошибкой, которую должен был бы исправить пользователь.) В коде PHP используется оператор ?: для выбора нужного значения длины, но функция Delphi Min (из математической функции ) единица) выражает желание более четко.

  // var ky: AnsiString;
  ky := StringReplace(key, ' ', '', [rfReplaceAll]);
  Assert(Length(ky) >= 8, 'key error');
  // var kl: Integer;
  kl := Min(Length(ky), 32);

Массив k используется для хранения чисел, представляющих пять младших битов каждого символа в ключе.В PHP массив будет автоматически увеличиваться до необходимого размера в зависимости от используемого индекса.В Delphi нам нужно заранее выделить место.Поскольку он установлен в цикле, который проходит по каждому символу ключа, мы знаем, что массив будет одинаковой длины.

  // var k: array of Byte;
  SetLength(k, kl);
  // var i: Integer;
  for i := 0 to Pred(kl) do
    k[i] := Ord(ky[i+1]) and $1f;

Затем каждый символ в строке, для которой установлен седьмой бит, изменяется в соответствии сна каждый последующий байт в массиве k.Переменная j отслеживает, какой байт ключа мы будем использовать следующим.

  // var j: Integer;
  j := 0;
  for i := 1 to Length(str) do begin
    // var e: Byte;
    e := Ord(str[i]);
    if (e and $e0) <> 0 then
      str[i] := AnsiChar(e xor k[j]);
    Inc(j);
    if j = kl then
      j := 0;
    // The previous three lines can also be written j := (j + 1) mod kl
  end;

Наконец, мы возвращаем новое значение str:

  Result := str;
end;
1 голос
/ 27 января 2011

Имейте в Delphi Cryptography Package Дэвида Бартона.Есть небольшой пример, который показывает, как заставить шифрование PHP и Delphi работать вместе.

0 голосов
/ 26 января 2011

Я думаю, что вам действительно нужно соединить свое приложение, а затем взглянуть на это, потому что это немного сложнее, чтобы попытаться объяснить здесь.На самом деле полезно интегрировать PHP / Java приложения через мост, но я думаю, что есть что-то для интеграции PHP / Delphi и через мост.

ZEND Server

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...