Текст строки в байтовый массив Java - RSA - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть система шифрования 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 на стороне клиента, но на всякий случай я включил используемые методы.

...