Перейти до

Кодирование пакета inetaccess


Рекомендованные сообщения

никак не могу закодировать пакет. Нашол уже готовую реализацию алгоритма шифрования, на C# закодировал LoginS сключем "pr7Hhen" на старгайзере получил User '▒N▒$▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒' NOT found! у старгайзера есть изменения в алгоритме ?

Ссылка на сообщение
Поделиться на других сайтах
  • Відповіді 67
  • Створено
  • Остання відповідь

Top Posters In This Topic

никак не могу закодировать пакет. Нашол уже готовую реализацию алгоритма шифрования, на C# закодировал LoginS сключем "pr7Hhen" на старгайзере получил User '▒N▒$▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒▒▒▒O▒▒▒' NOT found! у старгайзера есть изменения в алгоритме ?

Да

Ссылка на сообщение
Поделиться на других сайтах

думаю разница тут

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);
		    }
	    } 

Ссылка на сообщение
Поделиться на других сайтах

Попробуй поменять местами 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]);

Ссылка на сообщение
Поделиться на других сайтах

исходя из этого

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!

Ссылка на сообщение
Поделиться на других сайтах

библиотека взята отсюда http://www.google.com/codesearch#qdP7rZ400ag/src/core/&q=blowfish%20lang:%5Ec%23$&type=cs , и полностью идентична с тем что у старгайзера , думаю что у меня что то не то идет с инициализачией

Ссылка на сообщение
Поделиться на других сайтах

плз ткни меня носом в чем разница в коде ? я вызываю функцию 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);
}

Вроде тоже никаких расхожений

но .. на другом конце получается совершенно не то

Ссылка на сообщение
Поделиться на других сайтах

Порядок байт внутри xl/xr (смотри на bytes2block и комментарий к нему о том что для совместимости с OpenSSL нужно поменять порядок следования байт на противоположный).

Ссылка на сообщение
Поделиться на других сайтах

смотрю:

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!

Ссылка на сообщение
Поделиться на других сайтах

переделал с аналогом из 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!

Ссылка на сообщение
Поделиться на других сайтах

скопировал 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));
}

нет приведения из байта в блок и обратно , может в этом дело ?

Ссылка на сообщение
Поделиться на других сайтах

меня напрягают несколько моментов в реализации у старгайзера 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 и конечно пока не инициализируеш в него ничего не вписать ...

Ссылка на сообщение
Поделиться на других сайтах

На 32-битных платформах unsigned int имеет ту же разрядность что и unsigned long. На 64-х битах это не так, но т.к. переполнения нет то значения конвертируются без проблем. Теоретически, проблемы должны быть на Sparc64, но пару лет назад и на этой платформе проблем небыло.

Очистка S и P на самом деле даже и не нужна. Там оно сразу в цикле заполняется значениями полностью. Так что проблема не в этом.

Ссылка на сообщение
Поделиться на других сайтах

я как раз компилирую клиент на 64 битной платформе :) у меня для инициализации идёт пароль приведённый в байт. 7 байтов ничего лишнего (или я что то не догнал ?)

Ссылка на сообщение
Поделиться на других сайтах

Просто в C и его производных строки хранятся в виде массива байт с нулем в конце. При инициализации контекста у меня этот ноль не используется. Как там в C# - без понятия, тебе виднее.

Ссылка на сообщение
Поделиться на других сайтах

нет в 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;
		}

Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Вхід

Уже зарегистрированы? Войдите здесь.

Войти сейчас
  • Зараз на сторінці   0 користувачів

    Немає користувачів, що переглядають цю сторінку.


×
×
  • Створити нове...