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

0

秘密鍵は、同じサービスのバックアップ/複製目的以外ではエクスポートしないでください。クライアントとサーバーの両方の公開鍵のみをエクスポートする必要があります。ただし、これらのキーは何らかの方法で信頼する必要があります。クライアントとサーバーの両方から信頼されている (自己署名) CA によって署名された証明書にそれらを埋め込むことで、これを行うことができます。

トランスポート プロトコルの場合、AES CBC 暗号化では不十分であることに注意してください。整合性と信頼性の保護を追加する必要があります。これは通常、(H)MAC を追加することによって行われます。

単一の RSA キー ペアを使用して対称暗号化を実行しようとしているようです。

于 2015-02-25T22:32:07.673 に答える