/// <summary> /// 로그인 패킷을 분석하여 ID와 Password로 구성되어있는 로그인 토큰으로 만들고 반환합니다. /// </summary> /// <param name="packet">대상 패킷입니다.</param> /// <param name="dataIndex">데이터가 시작되는 위치입니다.</param> /// <param name="parameters">RSA 기본키가 들어있는 파라미터 정보입니다.</param> /// <returns>ID와 Password로 구성된 구조체 - 로그인 토큰</returns> public static LoginToken ParseLoginPacket(byte[] packet, int dataIndex, RSAParameters parameters) { LoginToken token = new LoginToken(); int length; byte[] encryptedPassword; // ID 데이터 추출 length = (int)BitConverter.ToUInt32(packet, dataIndex); dataIndex += SIZE_DATA_LENGTH; token.id = Encoding.Unicode.GetString(packet, dataIndex, length); dataIndex += length; // 암호화 처리된 PWD 데이터 추출 length = (int)BitConverter.ToUInt32(packet, dataIndex); dataIndex += SIZE_DATA_LENGTH; encryptedPassword = new byte[length]; Array.Copy(packet, dataIndex, encryptedPassword, 0, length); // 복호화 token.password = ConSecurityClass.RSADecryptToString(encryptedPassword, parameters); return(token); }
/// <summary> /// 사용자의 ID와 패스워드를 받아 로그인 패킷을 만듭니다. /// RSA 공개키를 이용해 암호화하므로 RSA 공개키가 담긴 패러미터를 요구합니다. /// </summary> /// <param name="token">로그인 토큰입니다. ID와 Password를 담습니다.</param> /// <param name="rsaParameters">RSA 공개키가 포함될 파라미터 정보입니다. /// 설정된 직렬화 정책상 기본키는 기록되지 않습니다.</param> /// <returns>로그인 패킷</returns> public static byte[] MakeLoginPacket(LoginToken token, RSAParameters rsaParameters) { byte[] encryptedPwd; // RSA 암호화 encryptedPwd = ConSecurityClass.RSAEncrypt(token.password, rsaParameters); //////////////////////////////////// int dataSize = (token.id.Length + SIZE_DATA_LENGTH) * 2 + encryptedPwd.Length; byte[] packet = new byte[HEADER_SIZE + dataSize]; int index = HEADER_SIZE; // 헤더 복사 Array.Copy( MakeHeader(dataSize, TypeNumber.Authorization, (byte)AuthorizationOption.LoginPacket), 0, packet, 0, HEADER_SIZE); // ID 복사 Array.Copy(BitConverter.GetBytes((UInt32)token.id.Length * 2), 0, packet, index, SIZE_DATA_LENGTH); index += SIZE_DATA_LENGTH; index += Encoding.Unicode.GetBytes(token.id, 0, token.id.Length, packet, index); // PWD 복사 Array.Copy(BitConverter.GetBytes((UInt32)encryptedPwd.Length), 0, packet, index, SIZE_DATA_LENGTH); index += SIZE_DATA_LENGTH; Array.Copy(encryptedPwd, 0, packet, index, encryptedPwd.Length); return(packet); }