от клиента приходит Sign(SHA256(RNDserver+RNDclient)), Login, RNDclient (RNDserver сгенерировал сервер и отправил клиенту на предыдущем шаге)
сервер вычисляет SHA256(RNDserver+RNDclient) и имеет, таким образом:
1. данные SHA256(RNDserver+RNDclient)
2. подпись Sign(SHA256(RNDserver+RNDclient))
теперь с помощью открытого ключа клиента, который сервер находит в базе по Login, сервер проверяет подпись
реализация функции проверки подписи зависит от выбранного вами алгоритма подписи, не знаю какие алгоритмы реализованы в библиотеках php
и ещё
если у вас $user_xkey подразумевается закрытым ключом пользователя, то в базе на сервере его хранить не надо)