У меня есть система шифрования RSA для защиты связи между сервером (Python) и клиентом (Java). В настоящее время мне удается правильно зашифровать и расшифровать информацию от клиента к серверу, используя ключи сервера. Что я не могу сделать, это расшифровать сообщение на клиенте (Java), которое приходит с сервера (Python).
Фрагмент шифрования в Python
выглядит следующим образом:
publicKeyStr = None
with open(PATH_KEY, 'r') as file:
publicKeyStr = file.read()
publicKeyClient = RSA.importKey(publicKeyStr)
encryptor = PKCS1_v1_5.new(key)
message = encryptor.encrypt(plainMessage)
# Message's length is always 128 bytes on the server side
#Send message to the client (RabbitMQ)
Переменная message
с зашифрованным содержимым принимается на стороне клиента в формате String, и здесь возникает проблема: метод расшифровки в Java ожидает ввод byte[]
и максимальный размер блока 128 байт, но при преобразовании строки String message
в массив byte[]
длина этой строки превышает 128 байтов. Это был мой подход на стороне клиента (Java):
public String call(String queue, byte[] message) throws IOException,
InterruptedException {
final String corrId = UUID.randomUUID().toString();
String replyQueueName = channel.queueDeclare().getQueue();
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.correlationId(corrId).replyTo(replyQueueName).build();
channel.basicPublish("", queue, props, message);
final BlockingQueue<String> response = new ArrayBlockingQueue<String>(1);
String ctag = channel.basicConsume(replyQueueName, true,
new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
if (properties.getCorrelationId().equals(corrId)) {
response.offer(new String(body, "UTF-8"));
}
}
});
String result = response.take();
channel.basicCancel(ctag);
return result;
}
public static String sendElement(String topic, byte[] message) {
SendRabbitMQ sendRabbitMQ = null;
String response = "";
try {
sendRabbitMQ = new SendRabbitMQ();
response = sendRabbitMQ.call(topic, message);
} catch (IOException | TimeoutException | InterruptedException e) {
e.printStackTrace();
} finally {
if (sendRabbitMQ != null) {
try {
sendRabbitMQ.close();
} catch (IOException _ignore) {
}
}
}
return response;
}
String response = SendRabbitMQ.sendElement("topic", encryptedInfo);
byte [] responseByte = response.getBytes();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
System.out.println(new String(cipher.doFinal(message)));
Ошибка возникает при назначении responseByte
, поскольку его размер превышает 128 символов.
Поэтому мой вопрос , как я могу преобразовать строку сообщения, отправленную со стороны сервера, на размер клиента, чтобы правильно преобразовать эту строку в массив байтов []?
EDIT : Я полагаю, что это не имеет отношения к коду RabbitMQ на стороне клиента, но на всякий случай я включил используемые методы.