【问题标题】:Openssl RSA Key generationOpenssl RSA 密钥生成
【发布时间】:2015-02-25 17:24:30
【问题描述】:

我有一个与服务器通信的客户端,通信使用 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;
    }

【问题讨论】:

    标签: php encryption cryptography botan


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    相关资源