Гибридная криптографическая реализация через сетевой сокет между Java и Stack Overflow

Я пытаюсь реализовать гибридную криптографию между двумя приложениями, одним Java и другим C ++. Вместо того, чтобы полагаться на хранение ключей в файле, я пытаюсь отправить ключи в виде байтового массива через сокет и заставить принимающее приложение воссоздать ключ из байтового массива. По линии

  1. Java: создание пары открытого и закрытого ключей (RSA)
  2. Java: передача открытого ключа в приложение C ++
  3. C ++: получить открытый ключ и воссоздать
  4. C ++: Генерация сеансового ключа (симметричный, AES) и шифрование с использованием полученного открытого ключа
  5. C ++: передача зашифрованного сеансового ключа
  6. Java: получить ключ сеанса и расшифровать его с помощью закрытого ключа пары ключей RSA

На этом этапе 2 приложения будут иметь симметричный ключ и будут обмениваться трафиком, используя его для шифрования и дешифрования. Моя проблема в шаге 3. Получив открытый ключ в виде байтового массива, я не могу успешно воссоздать его.

Джава

GenerateSymmetricKey genSymKey;
private static PrivateKey privateKey;
private static PublicKey publicKey;

public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException {
// Generate public/private key pair
GenerateKeys sk = new GenerateKeys(1024);
sk.createKeys();
privateKey = sk.getPrivateKey();
publicKey = sk.getPublicKey();

String server = "localhost";
int port = 8083;

try {

// Establish socket connection
InetAddress serverAddress = InetAddress.getByName(server);
Socket serverConnection = new Socket(serverAddress, port);

// Setup output streams
OutputStream os = serverConnection.getOutputStream();

os.write(publicKey.getEncoded());
os.flush();

C ++

if ( m_socket->bytesAvailable() > 8)
{
int len =  m_socket->bytesAvailable();
QByteArray encryptArray = m_socket->readAll();
encryptArray.resize(len);

QByteArray clientPublic = encryptArray.toBase64();
clientPublic.prepend("-----BEGIN PUBLIC KEY-----\n");
clientPublic.append("\n-----END PUBLIC KEY-----\n");

QSslCertificate clientCert(clientPublic);
QSslKey sslKey(clientPublic, QSsl::Rsa, QSsl::Pem, QSsl::PublicKey, "testtest");

qDebug() << "Client sslKey: " << sslKey.isNull();

Sslkey всегда нулевой. Я использую Crypto ++ на стороне C ++. Можно ли это сделать? Примеры, которые я видел, сохраняют ключи в файл, а не передают их по сети.

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …