Если вы абсолютно не хотите использовать SSL с сертификатами, вы можете свернуть свой собственный, хотя, очевидно, он не будет таким безопасным. Я просто импровизирую, смешивая небольшую асимметричную криптографию со стуком порта.
Во-первых, создайте случайную пару ключей RSA на клиенте в памяти, нет необходимости хранить ее где-либо. Затем клиент подключается к серверу с помощью простого сокета и при подключении отправляет серверу открытый ключ (закодируйте его по своему желанию, чтобы вы могли легко прочитать его на сервере). Затем сервер генерирует случайный 128-битный ключ, запускает ДРУГОЙ ServerSocket в произвольном порту и шифрует 128-битный ключ и новый номер порта сервера, используя открытый ключ клиента, и отправляет данные обратно клиенту. Сервер должен ждать в течение короткого периода времени, чтобы получить соединение от того же клиента на новый порт.
Клиент закрывает соединение, расшифровывает данные и открывает новый сокет для сервера на указанном порту. Затем и клиент, и сервер должны обернуть InputStream и OutputStream сокета в CipherInputStream и CipherOutputStream, используя AES / CBC / PKCS5Padding (или RC4, если хотите), с указанным 128-битным ключом. Вуаля, у вас есть безопасное соединение между клиентом и сервером, без какой-либо аутентификации.
Если вы хотите обработать аутентификацию, вы можете сделать это через безопасное соединение, или при первом соединении сервер также может иметь пару ключей RSA, они обмениваются ключами, и сервер может отправить запрос клиенту (сервер отправляет вызов клиенту с использованием открытого ключа клиента, и клиент отвечает на вызов с использованием открытого ключа сервера). Но это излишне сложно, и я думаю, что вам все равно лучше использовать стандартный SSL с хранилищами ключей ... возможно, вы можете создать хранилище ключей в памяти на клиенте и отправить его на сервер, как описано выше, используя первое соединение (шифрование хранилище ключей с открытым ключом сервера), а затем вы можете настроить второе соединение для использования SSL с этим хранилищем ключей, которое является временным и будет отброшено при отключении клиента.