2011-12-27 4 views
0

Я разрабатываю небольшую схему аутентификации с использованием RSA и RC4. В настоящий момент я пытаюсь отправить клиенту случайно сгенерированный ключ сеанса, зашифрованный с помощью открытого ключа клиента. Оттуда клиент прочитает ключ сеанса и расшифрует его с помощью своего закрытого ключа, а затем отправит хэш обратно на сервер (я не буду вдаваться в более тонкие механизмы безопасности, потому что они не являются частью проблемы).Частный ключ, дешифрующий симметричный ключ, но дающий разные результаты, когда симметричный ключ подключен к сети?

В настоящее время я подтвердил, что на сервере имеется идентичная копия открытого ключа клиента. Я знаю, что сервер шифрует случайно сгенерированный ключ сеанса с открытым ключом клиента. Таким образом, [скорее всего,] проблем нет.

Я думаю, что проблема заключается в передаче ключа. Ключ типа струнного и инициализируется как так -

String sessionKey = new BigInteger(128, server.random).toString(128); 

и передается клиенту с помощью DataOutputStream -

o.writeUTF(this.encryptedSessionKey); 

encryptedSessionKey нормальная строка, без определенного кодирования. Я думаю, что, возможно, при расшифровке, кодирование Java modified UTF-8, порождает ключ сеанса. Я расшифровать как это -

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()) возвращают разные данные из строки реализованной без определенной кодировки?

ответ

2

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^