Установил на билдер синапс, юзаю HMAC_MD5, так эта функция берет AnsiString аргументы и возвращает AnsiString, и потому хеш считается неверно от связки логина-пароля. Просто на С# HMACMD5 принимает byte[], и ей можно передать связку логин-пароль и ключ ввиде байтовых массивов. А как мне быть с синапсовой хренью? Передавать строку из "логинпароль" и ключ строкой и разве я получу верный хмакмд5 хеш? Растолкуйте пж.
________________ Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - твинки любого игрока, их дата создания, последний онлайн, статус удаления и прочее
Skype - freepvps
ICQ - 412705115
[Ссылки могут видеть только зарегистрированные пользователи. ] - ставкобот [Ссылки могут видеть только зарегистрированные пользователи. ] - общение в КЧ через смартфон
Type
TByteArray = array of byte;
function ByteArrayToAnsiString(aData : TByteArray) : AnsiString;
var
len : integer;
begin
len :=Length(aData);
if len > 0 then begin
SetLength(result, len);
MoveMemory(@result[1], @aData[0], len);
end;
end;
function AnsiStringToByteArray(aString : AnsiString) : TByteArray;
var
len : integer;
begin
len := Length(aString);
if len > 0 then begin
SetLength(result, len);
MoveMemory(@result[0], @aString[1], len);
end;
end;
function TAccountController.BuildClient03LoginAnounce(aLogin, aPassword: AnsiString) : TPacket;
var
pck : TPacket;
begin
// ~~~ Calculate login hash ~~~~~~~~~~~~~~~~~~~~~~~~~
self._userName := LowerCase(aLogin);
self._logPairHash := AnsiStringToByteArray(
HMAC_MD5(
ByteArrayToAnsiString(self._srvKey),
MD5(self._userName + aPassword))
);
// ~~~ Build packet ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pck := TPacket.Create($03);
pck.WriteByte(length(aLogin));
pck.WriteArray(AnsiStringToByteArray(self._userName));
pck.WriteByte(length(_logPairHash));
pck.WriteArray(_logPairHash);
pck.WriteByte($00);
result := pck;
end;
или я тупой или что то пошло не так \=
проблема как и у ТС, замучился уже
взял логин в нижнем регистре + пароль, перевел в hex
и это прогнал через md5 в итоге имею c99b6e98334dc4ee4c02267bdac28e7e
ключ из 0x1 - 780000d000000000e1023a72b14e2458
HMAC_MD5('c99b6e98334dc4ee4c02267bdac28e7e','78000 0d000000000e1023a72b14e2458');
выдает не тот результат, уже пробовал и в верхний и нижний регистр переводить ключ и мд5 и задом наперед писать оО все равно не тот результат, подскажите плиз где я дурак
ну я уже пытался loginpassword переводить
в ASCII (108 111 103 105 110 112 97 115 115 119 111 114 100)
в HEX (6c 6f 67 69 6e 70 61 73 73 77 6f 72 64)
и поверх MD5 прогонять и все равно не то =(
мне кажется я все перепроболва оО
логин + пароль: 6D 79 6C 6F 67 69 6E 70 61 73 73 77 6F 72 64
MD5: DA 76 B0 C1 EE B1 AB 4D 36 D5 F1 20 B8 B9 93 45
HMAC_MD5: 62 92 16 06 3E E1 89 46 28 1A 0C FF 79 9F 0D FD
а ожидал
HMAC_MD5: 57 B6 68 77 9E 9E C4 DA C5 63 84 0F F1 45 63 46
Кому удалось перепрыгнуть через SM_KEY повторите эксперимент и выложите полученные MD5 и HMAC_MD5.
Заранее благодарю.
В той строке, где вы генерируете HMACMD5, поменяйть MD5 и Ключ местами
________________ Для просмотра ссылок или изображений в подписях, у Вас должно быть не менее 10 сообщение(ий). Сейчас у Вас 0 сообщение(ий). - твинки любого игрока, их дата создания, последний онлайн, статус удаления и прочее
Skype - freepvps
ICQ - 412705115
[Ссылки могут видеть только зарегистрированные пользователи. ] - ставкобот [Ссылки могут видеть только зарегистрированные пользователи. ] - общение в КЧ через смартфон
Последний раз редактировалось FreePVP))); 08.01.2013 в 04:00.
// с использованием 'synacode'
type
aob = array of byte;
type
TConv = class
public
function StrToByteArray(s:string):aob;
function ByteArrayToStr(a:aob):string;
end;
//...
var
Form1: TForm1;
conv:TConv;
implementation
uses synacode;
//...
{ convert }
function Tconv.ByteArrayToStr(a: aob): string;
var
i:integer;
begin
for i:=0 to length(a)-1 do
result:=result+IntToHex(a[i],2)+' ';
end;
function Tconv.StrToByteArray(s: string): aob;
var
i:integer;
begin
setlength(result,length(s));
for i:=0 to length(s)-1 do
result[i]:=ord(s[i+1]);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
key: string; //ваш ключ (строка)
begin
key := 'ThisIsAnsiString';
edit3.Text:=conv.ByteArrayToStr(conv.StrToByteArray(
HMAC_MD5(key,MD5(Edit1.Text+Edit2.Text))));
// Edit1 - поле с логином
// Edit2 - поле с паролем
// В Edit3 - выводим полученный HMAC_MD5
end;
Сейчас борюсь с SMKey, CMKey.
Пришел к тому, что не могу распаковать пакет 0х04 )))
Кто-нить переводил сиё чудо на Delphi, или может есть рабочий исходник на C#
PS: т.к. с С# знаком плохо, пример FreePVP)) задействовать не смог, там по байтиках толкать надо, а АнгелЭму-вский выдает "индекс вне пределах массива".
----
Ах, да.
Ключ для шифрования делается так: EncKey = HMAC_MD5(hash_from_0x03 + EncHash_from_0x02, login);
Длина логина должна быть = 16. (Я добивал нулями (Char(0) ). По другому не заработало )
Последний раз редактировалось krysun; 19.02.2013 в 04:23.