Закрытый ключ расшифровывает симметричный ключ, но дает другие результаты, когда симметричный ключ подключен к сети? - PullRequest
0 голосов
/ 27 декабря 2011

Я разрабатываю небольшую схему аутентификации с использованием 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 ()), возвращались различные данные из строки, экземпляр которой не определенкодирование

1 Ответ

2 голосов
/ 27 декабря 2011

Я предполагаю, что вы делаете что-то вроде этого:

byte[] encryptedSessionKeyAsBytes = cipher.doFinal(...);
String encryptedSessionKey = new String(encryptedSessionKeyAsBytes);

Это неправильно.Конструктор String использует кодировку платформы по умолчанию для преобразования байтов в символы.И вся последовательность байтов не может быть преобразована в символы.Например, если кодировкой по умолчанию является ASCII, все отрицательные байты не могут быть преобразованы в символы.

Если вам нужно передать двоичные данные, то передайте их как байты (используя тип byte []),или используйте Base64 для преобразования байтов в печатные символы и используйте записывающее устройство с кодировкой ASCII, ISO-8859-1 или UTF-независимо для передачи строки Base-64.

...