예제 #1
0
    /// <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);
    }
예제 #2
0
    /// <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);
    }