Я некоторое время пытался зашифровать в созданной мной программе чата netty. Я пытался добавить шифрование БЕЗ сертификата или SSL путем шифрования самих сообщений. Я пробовал шифрование AES, и оно «успешно», но пароль для расшифровки сообщений был простым текстом, поэтому он ничего не делал. Я также пробовал шифрование RSA, но не могу заставить его шифровать строковое сообщение JSON
. Я использовал преобразование шифрования RSA: "RSA / ECB / PKCS1Padding"
public static String encrypt(String plainText, PublicKey publicKey) throws BadPaddingException, IllegalBlockSizeException, InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException {
Cipher cipher = Cipher.getInstance(StaticHandler.RSA_CIPHER_TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return new String(cipher.doFinal(plainText.getBytes()), CharsetUtil.UTF_8);
}
Как этоработает в настоящее время:
Сервер генерирует пару ключей, используемую только в начальном рукопожатии, а затем отправляет открытый ключ клиенту. Затем клиент генерирует новую пару ключей, зашифрованную открытым ключом, отправленным сервером. Как только сервер получает новую пару ключей, он использует ее вместо той, которая была создана в начальном рукопожатии, чтобы клиент мог расшифровать сообщения, отправленные сервером.
Но я не могу заставить его работать с ним. отправка строки JSON с частью рукопожатия соединения, где клиент генерирует новую пару ключей, которую сервер будет использовать для отправки зашифрованных сообщений обратно клиенту.
Я не обязательно запрашиваю код подачи ложки, нообъяснение того, как это можно сделать лучше, или протокол шифрования, который лучше подходит для моих средств, хотя полезно увидеть примеры кода: p
javax.crypto.IllegalBlockSizeException: Data must not be longer than 501 bytes
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:344)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2164)
at com.github.fernthedev.universal.encryption.EncryptionHandler.encrypt(EncryptionHandler.java:150)
at com.github.fernthedev.universal.encryption.RSA.EncryptedStringEncoder.encode(EncryptedStringEncoder.java:49)
at com.github.fernthedev.universal.encryption.RSA.EncryptedGSONObjectEncoder.encode(EncryptedGSONObjectEncoder.java:70)
at com.github.fernthedev.universal.encryption.RSA.EncryptedGSONObjectEncoder.encode(EncryptedGSONObjectEncoder.java:16)
at io.netty.handler.codec.MessageToMessageEncoder.write(MessageToMessageEncoder.java:89)
at io.netty.channel.AbstractChannelHandlerContext.invokeWrite0(AbstractChannelHandlerContext.java:716)
at io.netty.channel.AbstractChannelHandlerContext.invokeWriteAndFlush(AbstractChannelHandlerContext.java:763)
at io.netty.channel.AbstractChannelHandlerContext.write(AbstractChannelHandlerContext.java:789)
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:757)
at io.netty.channel.AbstractChannelHandlerContext.writeAndFlush(AbstractChannelHandlerContext.java:812)
at io.netty.channel.DefaultChannelPipeline.writeAndFlush(DefaultChannelPipeline.java:1037)
at io.netty.channel.AbstractChannel.writeAndFlush(AbstractChannel.java:293)
at com.github.fernthedev.client.Client.sendObject(Client.java:270)
at com.github.fernthedev.client.EventListener.received(EventListener.java:91)
at com.github.fernthedev.client.netty.ClientHandler.channelRead(ClientHandler.java:71)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:102)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:328)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:315)
at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:429)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:283)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.handler.timeout.IdleStateHandler.channelRead(IdleStateHandler.java:287)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1422)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:635)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514)
at io.netty.util.concurrent.SingleThreadEventExecutor$6.run(SingleThreadEventExecutor.java:1044)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.lang.Thread.run(Thread.java:748)