Я пытаюсь реализовать гибридную криптографию между двумя приложениями, одним Java и другим C ++. Вместо того, чтобы полагаться на хранение ключей в файле, я пытаюсь отправить ключи в виде байтового массива через сокет и заставить принимающее приложение воссоздать ключ из байтового массива. По линии
На этом этапе 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 ++. Можно ли это сделать? Примеры, которые я видел, сохраняют ключи в файл, а не передают их по сети.
Задача ещё не решена.
Других решений пока нет …