Roman Pogosyan 3 Опубликовано: 2011-09-24 08:41:50 Share Опубликовано: 2011-09-24 08:41:50 никак не могу закодировать пакет. Нашол уже готовую реализацию алгоритма шифрования, на C# закодировал LoginS сключем "pr7Hhen" на старгайзере получил User '▒N▒$▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒' NOT found! у старгайзера есть изменения в алгоритме ? Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-24 09:32:40 Share Опубліковано: 2011-09-24 09:32:40 никак не могу закодировать пакет. Нашол уже готовую реализацию алгоритма шифрования, на C# закодировал LoginS сключем "pr7Hhen" на старгайзере получил User '▒N▒$▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒' NOT found! у старгайзера есть изменения в алгоритме ? Да Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-24 09:52:01 Автор Share Опубліковано: 2011-09-24 09:52:01 думаю разница тут public void Encipher(byte[] data, int length) { uint xl, xr; if ((length % 8) != 0) throw new Exception("Invalid Length"); for (int i = 0; i < length; i += 8) { // Encode the data in 8 byte blocks. xl = (uint)((data[i] << 24) | (data[i + 1] << 16) | (data[i + 2] << 8) | data[i + 3]); xr = (uint)((data[i + 4] << 24) | (data[i + 5] << 16) | (data[i + 6] << 8) | data[i + 7]); Encipher(ref xl, ref xr); // Now Replace the data. data[i] = (byte)(xl >> 24); data[i + 1] = (byte)(xl >> 16); data[i + 2] = (byte)(xl >> 8); data[i + 3] = (byte)(xl); data[i + 4] = (byte)(xr >> 24); data[i + 5] = (byte)(xr >> 16); data[i + 6] = (byte)(xr >> 8); data[i + 7] = (byte)(xr); } } Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-24 10:37:24 Share Опубліковано: 2011-09-24 10:37:24 Попробуй поменять местами xl и xr в xl = (uint)((data[i] << 24) | (data[i + 1] << 16) | (data[i + 2] << 8) | data[i + 3]); xr = (uint)((data[i + 4] << 24) | (data[i + 5] << 16) | (data[i + 6] << 8) | data[i + 7]); Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-24 13:12:01 Автор Share Опубліковано: 2011-09-24 13:12:01 ne pomoglo Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-24 13:26:41 Автор Share Опубліковано: 2011-09-24 13:26:41 inetaccess.cpp > 18:26:13 > User 'p▒ ▒ ▒▒{]ell▒)▒]ell▒)▒]ell▒)▒' NOT found! Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-24 13:45:06 Автор Share Опубліковано: 2011-09-24 13:45:06 исходя из этого for (int i = 0; i < IA_LOGIN_LEN/8; i++) { Blowfish_Encrypt(&ctxHdr, (uint32_t*)(buffer + db + i*8), (uint32_t*)(buffer + db + i*8 + 4)); } должно получится следущее for (int i =0;i< length/8;i ++) { но в данном случае выходит inetaccess.cpp > 18:40:37 > User '▒z▒▒' NOT found! Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-24 13:56:25 Автор Share Опубліковано: 2011-09-24 13:56:25 библиотека взята отсюда http://www.google.com/codesearch#qdP7rZ400ag/src/core/&q=blowfish%20lang:%5Ec%23$&type=cs , и полностью идентична с тем что у старгайзера , думаю что у меня что то не то идет с инициализачией Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-24 15:20:13 Автор Share Опубліковано: 2011-09-24 15:20:13 плз ткни меня носом в чем разница в коде ? я вызываю функцию private void Encipher(ref uint xl, ref uint xr) (сделал ее пабликом) вроде никаких расхождений со старгайзеровой Blowfish_Encrypt там уже вместо int db = sizeof(HDR_8); for (int i = 0; i < IA_LOGIN_LEN/8; i++) { Blowfish_Encrypt(&ctxHdr, (uint32_t*)(buffer + db + i*8), (uint32_t*)(buffer + db + i*8 + 4)); } for (int i = 0; i < IA_LOGIN_LEN/8; i++){ xl = (uint)((data[i*8] << 24) | (data[i*8 + 1] << 16) | (data[i*8 + 2] << 8) | data[i*8 + 3]); xr = (uint)((data[i*8 + 4] << 24) | (data[i*8 + 5] << 16) | (data[i*8 + 6] << 8) | data[i*8 + 7]); Encipher(fer xl, ref xr); а потом обратно в байт data[i*8] = (byte)(xl >> 24); data[i*8 + 1] = (byte)(xl >> 16); data[i*8 + 2] = (byte)(xl >> 8); data[i*8 + 3] = (byte)(xl); data[i*8 + 4] = (byte)(xr >> 24); data[i*8 + 5] = (byte)(xr >> 16); data[i*8 + 6] = (byte)(xr >> 8); data[i*8 + 7] = (byte)(xr); } Вроде тоже никаких расхожений но .. на другом конце получается совершенно не то Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-25 06:07:35 Share Опубліковано: 2011-09-25 06:07:35 Порядок байт внутри xl/xr (смотри на bytes2block и комментарий к нему о том что для совместимости с OpenSSL нужно поменять порядок следования байт на противоположный). Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-26 07:05:59 Автор Share Опубліковано: 2011-09-26 07:05:59 смотрю: int32_t bytes2block(const char * c) { uint32_t t = static_cast<unsigned char>(*c++); t += static_cast<unsigned char>(*c++) << 8; t += static_cast<unsigned char>(*c++) << 16; t += static_cast<unsigned char>(*c) << 24; return t; } если представить что *с это массив из 4-х элементов то выходит xl = (uint)((data[i]) | (data[i + 1] << 8) | (data[i + 2] << 16) | data[i + 3]<<24); И обратное преобразование data[i] = (byte)(xl ); data[i + 1] = (byte)(xl>>8); data[i + 2] = (byte)(xl >> 16); data[i + 3] = (byte)(xl >> 24); inetaccess.cpp > 12:06:00 > User '2▒▒▒u\▒▒▒▒▒da▒▒▒▒▒da▒▒▒▒▒da' NOT found! Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-26 07:44:41 Автор Share Опубліковано: 2011-09-26 07:44:41 переделал с аналогом из common , и так функции private uint byte2block(byte[] c) { int pos = 0; uint t = (uint)c[pos]; pos++; t += (uint)c[pos] << 8; pos++; t += (uint)c[pos] << 16; pos++; t += (uint)c[pos] << 24; pos++; return t; } void block2bytes(uint t, byte[] c) { int pos = 0; c[pos] = (byte)(t ); pos++; c[pos] = (byte)(t >> 8 ); pos++; c[pos] = (byte)(t >> 16 ); pos++; c[pos] = (byte)(t >> 24 ); pos++; } само шифрование string strkey = "pr7Hhen";//pr7Hhen UTF8Encoding uft8 = new UTF8Encoding(); Blowfish bf = new Blowfish(uft8.GetBytes(strkey) ); // вырезаем loginS byte[] LoginS = new byte[32]; Array.Copy(senbuff, 8, LoginS, 0, 32); // Шифруем LoginS byte[] byteblock = new byte[4]; uint xl,xr; for (int i = 0; i < 32 / 8; i++) { //копируем левые 4 байта Array.Copy(LoginS,i,byteblock,0,4); //преобразуем в блок xl=byte2block(byteblock); //на всякийслучай очищаем Array.Clear(byteblock,0,4); //копируем правые 4 байта Array.Copy(LoginS,i+4,byteblock,0,4); //преобразуем в блок xr=byte2block(byteblock); //на всякийслучай очищаем Array.Clear(byteblock,0,4); // кодируем bf.Encipher(ref xl,ref xr); //преобразуем левый блок в байт block2bytes(xl, byteblock); //вписывам на место Array.Copy(byteblock, 0, LoginS, i, 4); //на всякийслучай очищаем Array.Clear(byteblock, 0, 4); //преобразуем прашый блок в байт block2bytes(xr, byteblock); //вписывам на место Array.Copy(byteblock, 0, LoginS, i+4, 4); //на всякийслучай очищаем Array.Clear(byteblock, 0, 4); } // Вписываем LoginS на место Array.Clear(senbuff, 8, 32); Array.Copy(LoginS, 0, senbuff, 8, 32); //отсылаем StgClient.Send(senbuff, senbuff.Length); результат > User '▒m4 Y▒▒jV▒Y▒gA|▒]ell▒)▒]ell▒)▒' NOT found! Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-26 08:29:54 Share Опубліковано: 2011-09-26 08:29:54 Ну не знаю. Что-то ты делаешь неправильно. Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-26 08:46:40 Автор Share Опубліковано: 2011-09-26 08:46:40 у старгайзера Ctx состоит из long у меня из int , единственное в чем разница , взял другую реализацию результат тот же Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-26 11:31:40 Автор Share Опубліковано: 2011-09-26 11:31:40 переслал ctxS себе и сравнил со своим ctx -ом ... масивыразные Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-26 12:54:23 Share Опубліковано: 2011-09-26 12:54:23 переслал ctxS себе и сравнил со своим ctx -ом ... масивыразные Значит некорректная реализация алгоритма BlowFish Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-27 06:58:56 Автор Share Опубліковано: 2011-09-27 06:58:56 скопировал blowfish.cpp перевёл его в вид для C# 100% теперь реализация не отличается .. но все равно inetaccess.cpp > 11:45:41 > User '2▒▒▒u\▒▒▒▒▒da▒▒▒▒▒da▒▒▒▒▒da' NOT found! но появилась мысля .. в // Шифруем LoginS int db = sizeof(HDR_8);for (int i = 0; i < IA_LOGIN_LEN/8; i++) { Blowfish_Encrypt(&ctxHdr, (uint32_t*)(buffer + db + i*8), (uint32_t*)(buffer + db + i*8 + 4)); } нет приведения из байта в блок и обратно , может в этом дело ? Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-27 08:02:54 Share Опубліковано: 2011-09-27 08:02:54 Если там его нет то его там и не нужно. Скорее всего при переводе в C# ты что-то упускаешь. Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-27 09:06:23 Автор Share Опубліковано: 2011-09-27 09:06:23 меня напрягают несколько моментов в реализации у старгайзера 1) масивы для ctx static const uint32_t ORIG_P[16 + 2] = { 0x243F6A88L, 0x85A308D3L, 0x13198A2EL, 0x03707344L, 0xA4093822L, 0x299F31D0L, 0x082EFA98L, 0xEC4E6C89L, 0x452821E6L, 0x38D01377L, 0xBE5466CFL, 0x34E90C6CL, 0xC0AC29B7L, 0xC97C50DDL, 0x3F84D5B5L, 0xB5470917L, 0x9216D5D9L, 0x8979FB1BL }; у них на конце L , то биш они long но описание масива идет как unsigned int (думаю отсюда идет разница ctx) 2) Инициализация ctx void Blowfish_Init(BLOWFISH_CTX *ctx, unsigned char *key, int keyLen) { int i, j, k; uint32_t data, datal, datar; memset(ctx->S, 0, sizeof(ctx->S)); запись нулей в массив S есть а вот P остаётся каким то пустым (ему ничего не присваивается в начале) в C# он получается null и конечно пока не инициализируеш в него ничего не вписать ... Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-27 12:43:24 Share Опубліковано: 2011-09-27 12:43:24 На 32-битных платформах unsigned int имеет ту же разрядность что и unsigned long. На 64-х битах это не так, но т.к. переполнения нет то значения конвертируются без проблем. Теоретически, проблемы должны быть на Sparc64, но пару лет назад и на этой платформе проблем небыло. Очистка S и P на самом деле даже и не нужна. Там оно сразу в цикле заполняется значениями полностью. Так что проблема не в этом. Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-27 12:45:05 Share Опубліковано: 2011-09-27 12:45:05 Проверь, не используешь ли ты 0-й символ в конце пароля для инициализации? Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-27 13:08:01 Автор Share Опубліковано: 2011-09-27 13:08:01 я как раз компилирую клиент на 64 битной платформе у меня для инициализации идёт пароль приведённый в байт. 7 байтов ничего лишнего (или я что то не догнал ?) Ссылка на сообщение Поделиться на других сайтах
madf 279 Опубліковано: 2011-09-27 13:15:53 Share Опубліковано: 2011-09-27 13:15:53 Просто в C и его производных строки хранятся в виде массива байт с нулем в конце. При инициализации контекста у меня этот ноль не используется. Как там в C# - без понятия, тебе виднее. Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-27 13:19:09 Автор Share Опубліковано: 2011-09-27 13:19:09 нет в C# при перекодировке стринга в байт выходит 7 байтов которые используются тут for (i = 0; i < N + 2; ++i) { data = 0x00000000; for (k = 0; k < 4; ++k) { data = (data << 8) | key[j]; j++; if (j >= key.Length) { j = 0; } } P[i] = P[i] ^ data; } Ссылка на сообщение Поделиться на других сайтах
Roman Pogosyan 3 Опубліковано: 2011-09-27 13:21:45 Автор Share Опубліковано: 2011-09-27 13:21:45 очень мало кода .. и все очень совместимо .. по этому как-то тупо не получается Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Создайте аккаунт или войдите в него для комментирования
Вы должны быть пользователем, чтобы оставить комментарий
Создать аккаунт
Зарегистрируйтесь для получения аккаунта. Это просто!
Зарегистрировать аккаунтВхід
Уже зарегистрированы? Войдите здесь.
Войти сейчас