PDA

Просмотр полной версии : Проблема с пакетом RequestAuthLogin


i_am_kisly
12.04.2015, 15:27
Помогите решить проблему с пакетом. При одном и том же логине на стороне клиента, на стороне сервера он расшифровывается в "случайный" набор символов. Если включить автосоздание аккаунтов, то сервер создает аккаунт и присылает "LoginOK".
Логично предположить, что проблема на этапе сборки и/или шифрования, не где - я хз уже всё облазил, но не догоняю.
Очень прошу помочь советом, ошибка где-то в этом коде (шифрование нагло стырено из L2NET):


//Осторожно быдлокод! Уберите женщин и беременных детей от мониторов!!

// RSA_pubKeyMod must point to 128-bytes length buffer
public bool create( byte[] szL2Login, byte[] szL2Password, uint ggAuthResponse, byte[] RSA_pubKeyMod )
{
//
// vars
int l2l_len = szL2Login.Length;
int l2p_len = szL2Password.Length;
byte[] l2login = new byte[L2_LOGIN_MAXLEN];
byte[] l2password = new byte[L2_PASSWORD_MAXLEN];
byte[] block128 = new byte[128];
int i = 0;
const int l2l_offset = 94;
const int l2p_offset = 108;

// check strings length
if( (l2l_len<1) || (l2l_len>L2_LOGIN_MAXLEN) )
{
Console.WriteLine( "L2Login_RequestAuthLogin::create(): L2 Login length must be [1..{0}] chars\n", L2_LOGIN_MAXLEN );
return false;
}
if( (l2p_len<1) || (l2p_len>L2_PASSWORD_MAXLEN) )
{
Console.WriteLine( "L2Login_RequestAuthLogin::create(): L2 Password length must be [1..{0}] chars\n", L2_PASSWORD_MAXLEN );
return false;
}
// copy strings
for( i=0; i<(int)l2l_len; i++ ) l2login = szL2Login[i];
for( i=0; i<(int)l2p_len; i++ ) l2password[i] = szL2Password[i];

//

Array.Copy(l2login , 0, block128, l2l_offset, L2_LOGIN_MAXLEN);
Array.Copy(l2password, 0, block128, l2p_offset, L2_PASSWORD_MAXLEN);

// RSA encode block...
if( !this.block_encode_RSA( ref block128, (uint)block128.Length, RSA_pubKeyMod ) ) return false;
// construct packet
this.writeReset();
this.setPacketType( 0x00 ); // RequestAuthLogin code
this.writeBytes( block128, (uint)block128.Length ); // block with login/password
this.writeUInt( ggAuthResponse ); // from GGAuthResponse
for( i=0; i<16; i++ ) this.writeUChar( 0x00 ); // 16 NULLs
this.writeUChar( 0x08 );
for( i=0; i<10; i++ ) this.writeUChar( 0x00 ); // some 11 bytes
// now packet must be padded to 8-byte border
// next caller must add checksum, and so on...
return true;
}

// for internal use only
// encode block with login/password
// RSA_pubKeyMod must point to 128-bytes length buffer
protected bool block_encode_RSA( ref byte[] block , uint blockSize, byte[] RSA_pubKeyMod )
{
//
byte[] Exponent = {1,0,1};

//Create a new instance of RSAParameters.
System.Security.Cryptography.RSAParameters RSAKeyInfo = new System.Security.Cryptography.RSAParameters();

//Set RSAKeyInfo to the public key values.
RSAKeyInfo.Modulus = RSA_pubKeyMod;
RSAKeyInfo.Exponent = Exponent;

L2_Login.RSAManaged poo = new L2_Login.RSAManaged();
poo.ImportParameters(RSAKeyInfo);

byte[] outb = new byte[128];

outb = poo.EncryptValue(block);
return true;

}


По сути меняться могут только RSA_pubKeyMod, так как ggAuthResponse у меня всегда равен нулю.

[I]Добавлено через 13 часов 20 минут
Зашибись у меня RSA работает :) Два дня не спал прост, как проспался, так сразу заметил.

noklin
12.04.2015, 15:50
Я что-то не понял в чем проблема?:)

i_am_kisly
13.04.2015, 19:24
Да разобрался уже. Результат rsa шифрования никуда не передавался.