Я разрабатываю небольшую схему аутентификации с использованием RSA и RC4.На данный момент я пытаюсь отправить клиенту случайно сгенерированный сеансовый ключ, зашифрованный с использованием открытого ключа клиента.После этого клиент прочитает ключ сеанса и расшифрует его, используя свой закрытый ключ, а затем отправит хэш обратно на сервер (я не буду вдаваться в более тонкие механизмы безопасности, поскольку они не являются частью проблемы).
В настоящее время я подтвердил, что на сервере есть идентичная копия открытого ключа клиента.Я знаю, что сервер шифрует случайно сгенерированный сеансовый ключ с помощью открытого ключа клиента.Так что [скорее всего] проблем там нет.
Я думаю, что проблема заключается в передаче ключа.Ключ имеет строковый тип и инициализируется следующим образом -
String sessionKey = new BigInteger(128, server.random).toString(128);
и передается клиенту с помощью DataOutputStream -
o.writeUTF(this.encryptedSessionKey);
encryptedSessionKey isобычная строка, без конкретной кодировки.Я думаю, что, возможно, при дешифровании модифицированная Java кодировка UTF-8 Java искажает ключ сеанса.Я расшифровываю так -
this.sessionKey = new String(cryptUtil.rsaDecrypt(clientPrivateKey, this.encryptedSessionKey.getBytes()));
// Where encryptedSessionKey is read from the stream using i.readUTF();
Если бы при использовании String.getBytes () для строки, закодированной в Java, модифицированной UTF-8 (считанной из DataInputStream.readUTF ()), возвращались различные данные из строки, экземпляр которой не определенкодирование