有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

基于java与C++的网络socket混合密码实现

我尝试在2个应用程序之间混合密码实现,一个java和另一个C++。我不依赖文件中的密钥存储,而是尝试通过socket将密钥作为字节数组发送,并让接收应用程序从字节数组重新创建密钥。沿着

  1. Java:生成公钥/私钥对(RSA)
  2. java:将公钥传输到C++应用程序
  3. C++:接收公钥并重新创建
  4. C++:生成会话密钥(对称,AES)并使用收到的公钥进行加密
  5. C++:传输加密的会话密钥
  6. Java:接收会话密钥并使用RSA密钥对的私钥解密

此时,这两个应用程序将拥有对称密钥,并继续使用它进行加密和解密以交换流量。我的问题在第三步。在以字节数组形式接收公钥时,我无法成功地重新创建它

爪哇

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始终为空。我在C++的边上使用了密码+ +。这能做到吗?我看到的例子是将密钥保存到文件中,而不是通过网络传输


共 (0) 个答案