0

我有一个与服务器通信的客户端,并且使用 RSA 和 AES 组合对通信进行加密。我生成的 RSA 密钥对没有密码。因此,为了确保安全,我最近添加了密码。每件事都在服务器端运行良好,但 PHP 生成的私钥不包含加密信息,因此我无法在客户端加载它。以下是php代码:

    $passphrase = 'Hello World';

    $config = array ("digest_alg" => "sha256","private_key_bits" => 2048,"private_key_type" => OPENSSL_KEYTYPE_RSA );
    // Create the private and public key
    $res = openssl_pkey_new ( $config );
    /* Extract the private key from $res to $privKey */
    openssl_pkey_export ( $res, $priv_key, $passphrase );
    /* Extract the public key from $res to $pubKey */
    $pub_key = openssl_pkey_get_details ( $res );
    $pub_key = $pub_key["key"];
    $pkey_pair = array ('priv_key' => $priv_key,'pub_key' => $pub_key );
    var_dump($pkey_pair);

您可以在http://phpfiddle.org/上尝试它没有加密信息,就好像它假设那样,因为它在服务器端工作!

我的客户端代码仅在 RSA 密钥生成中未使用密码时才有效。

try
    {
        Botan::AutoSeeded_RNG rng;
        Botan::DataSource_Memory privKeyMem(privKey);
        Botan::RSA_PrivateKey *rsaKey = dynamic_cast     <Botan::RSA_PrivateKey*> 
       (Botan::PKCS8::load_key(privKeyMem, rng, passphrase.c_str()));
        if(!rsaKey)
        {
             std::cout << "The loaded key is not a RSA key!\n";
             return false;
        }
        ....
        .....
    }
    catch(...)
    {
        cout<<"Exception: could not load private key";
        return false;
    }
4

2 回答 2

1

使用密码导出 RSA 密钥不会导致生成的密钥对有任何不同;它只是使用该密码加密私钥。如果您的客户端代码无法解密加密密钥,请不要使用 passphrase

此外,您当前使用的客户端代码似乎正在尝试加载 PKCS8 格式的私钥。这是不正确的;openssl_pkey_export()生成 PEM 格式的公钥和私钥。

于 2015-02-25T17:27:32.783 回答
0

不应导出私钥,除非可能用于同一服务的备份/复制目的。您应该只导出客户端和服务器的公钥。不过,这些密钥需要以某种方式被信任。您可以通过将它们嵌入由客户端和服务器都信任的(自签名)CA 签名的证书中来做到这一点。

请注意,对于传输协议,AES CBC 加密是不够的。您将需要添加完整性和真实性保护。这通常通过添加 (H)MAC 来完成。

您似乎正在尝试使用单个 RSA 密钥对执行对称加密。

于 2015-02-25T22:32:07.673 回答