Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> аналог функции pack из php 
:(
    Опции темы
gashik
Дата 31.5.2012, 07:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Здравствуйте уважаемые профи!!!

Собственно, вопрос:
есть следующее выражение на пхп, относящееся к ws-security

Код

$mydigest = base64_encode(pack("H*", sha1(base64_decode($digest[nonce]) . $digest[created] . 'user')));



сделал на делфи

Код

  s:=EncodeBase64(SHA1(s+Hdr.UsernameToken.Created.NativeToXS+pass));



но без упаковки, который делает pack выдает ессно неправильный результат. Помогите упаковать данные как на пыхе, с форматом H. В гугле ниче не нашел, что могло бы мне помочь.
Так, на всякий случай для справки:автор
Цитата

string pack (string format [, mixed args])
Упаковывает данные аргументы в бинарную строку в соответствии с форматом format. Возвращает бинарную строку с данными.


H Hex-строка, сначала высший разряд

Код

$binarydata = pack ("р*", '1234');



 Результирующая бинарная строка имеет длину 6 байт и содержит байтовую последовательность 0x12, 0x34.

PM MAIL   Вверх
Alkash
Дата 31.5.2012, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


коллекционер жизни
**


Профиль
Группа: Участник
Сообщений: 516
Регистрация: 5.7.2004
Где: /

Репутация: нет
Всего: нет



Код

s := Format('%x', [StrToInt(raw)]);
HexToBin(PChar(s), @s, length(s));


Что-то вроде этого воспроизводит указанный функционал.


--------------------
Подпись >> /dev/null
PM MAIL ICQ MSN   Вверх
gashik
Дата 31.5.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Цитата(Alkash @  31.5.2012,  10:04 Найти цитируемый пост)
s := Format('%x', [StrToInt(raw)]);HexToBin(PChar(s), @s, length(s));

Не, не получаеться. Слишком большая длина строки. SHA1 - 40 символов. Вываливаеться эксепшн "is not a valid integer value". 

Это сообщение отредактировал(а) gashik - 31.5.2012, 10:13
PM MAIL   Вверх
CynicRus
Дата 31.5.2012, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: 2
Всего: 5



А исходную строку вы в [StrToInt(raw)] кладете?

Добавлено через 1 минуту и 47 секунд
Слишком большая длинна строки, это несколько...м-м - неверно, поскольку компилятор ругается на некорректное значение integer. 
PM MAIL   Вверх
gashik
Дата 31.5.2012, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



var s: RawByteString; - не?

PM MAIL   Вверх
CynicRus
Дата 31.5.2012, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 248
Регистрация: 31.5.2012

Репутация: 2
Всего: 5



Попробуй s: string, должно работать. Ибо как гласит classes.pas 

Код

function HexToBin(Text : PWideChar; Buffer: PAnsiChar; BufSize: Integer): Integer;
function HexToBin(Text : PAnsiChar; Buffer: PAnsiChar; BufSize: Integer): Integer;
function HexToBin(Text: PWideChar; var Buffer; BufSize: Integer): Integer;
function HexToBin(Text: PAnsiChar; var Buffer; BufSize: Integer): Integer;
function HexToBin(Text: PWideChar; Buffer: Pointer; BufSize: Integer): Integer;
function HexToBin(Text: PAnsiChar; Buffer: Pointer; BufSize: Integer): Integer;


Это сообщение отредактировал(а) CynicRus - 31.5.2012, 16:20
PM MAIL   Вверх
gashik
Дата 31.5.2012, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



s: string - тот же ексепшн

не получаеться((


Код

$digest['nonce']='jg6YcXB2F0SJq4VVzXEsOQkAAAAAAA==';
$digest[created]='2012-05-30T18:16:16.500Z';
$pass=user;

$mydigest = sha1(base64_decode($digest[nonce]) . $digest[created] . $pass) //результат в  mydigest 97074e9f4d973a45be825e5a37cfbaeaf26c1768, длина строки 40 байт

$mydigest = pack("H*",$mydigest) //результат в  mydigest #97#07#4E#9F#4D#97#3A#45#BE#82#5E#5A#37#CF#BA#EA#F2#6C#17#68, длина строки 20 байт




Код

var
   pass,myDate,s:RawByteString;
   i: TBytes;
begin
  pass:='user';
  myDate:='2012-05-30T18:16:16.500Z';
  s:='jg6YcXB2F0SJq4VVzXEsOQkAAAAAAA==';
  s:=Base64decode(PAnsiChar(s),Length(s));
  s:=SHA1(s+myDate+pass); // результат верный, совпадает с результатом в пхп 97074e9f4d973a45be825e5a37cfbaeaf26c1768
  i:=BytesOf(s);

  SetLength(S, Length(i) * 2);
  BinToHex(PAnsiChar(i), PChar(S), Length(i));//  результат, ессно не совпадает и размер тоже
end;


Это сообщение отредактировал(а) gashik - 31.5.2012, 16:48
PM MAIL   Вверх
gashik
Дата 31.5.2012, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



Может я что-то не так обьяснил 

Код

$mydigest=pack("H*",'12345678');// в переменной $mydigest значение равное #12#34#56#78


Это сообщение отредактировал(а) gashik - 31.5.2012, 16:55
PM MAIL   Вверх
gashik
Дата 31.5.2012, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 16.6.2010

Репутация: нет
Всего: нет



НАШЕЛ!!!!!!
Код


function StrToHex(Const Source: String): String;
 var
   c:Char;
 begin
   Result := '';
   for c in Source do
     Result := Result + IntToHex(Integer(c), 2);
 end;


function HexToStr(HexStr : String; const Text : boolean = True) : string;
 var
   Hex : byte;
   sTemp : string;
   i : integer;
 begin
   Result := '';
   if Length(HexStr) mod 2 <> 0 then
     Exit;//('Неправельная длина строки');

   for i := 2 to Length(HexStr) do
     if i mod 2 = 0 then begin
       sTemp := '$' + Copy(HexStr, i - 1, 2);
       Hex := Byte(StrToInt(sTemp));

       if Hex = $00 then begin
         if Text then
           Result := Result + ' '
         else
           Result := Result + #$00;
         Continue;
       end;
       Result := Result + chr(Hex);
     end;
 end;

PM MAIL   Вверх
Google
  Дата 29.2.2020, 14:25 (ссылка)  





  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0714 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.