5

OpenID を Wordpress プラグインとして使用するためのステートフル ライブラリを作成しようとしています。openssl 関数openssl_dh_compute_keyを使用してシークレット値を計算しようとすると、問題が発生します。誰かが私が試すことができるいくつかのステップ、ヒントなどを持っているかどうか興味があります...

ありがとう!

定数...

const DH_DEFAULT_PRIME = "dcf93a0b883972ec0e19989ac5a2ce310e1d37717e8d9571bb7623731866e61ef75a2e27898b057f9891c2e27a639c3f29b60814581cd3b2ca3986d2683705577d45c2e7e52dc81c7a171876e5cea74b1448bfdfaf18828efd2519f14e45e3826634af1949e5b535cc829a483b8a76223e5d490a257f05bdff16f2fb22c583ab";
const DH_DEFAULT_GENERATOR = '02';

Diffie-Hellman キーの作成

private function createDHKey($priv_key = false) {
    if (!$priv_key) {
        $details = array();
        $details['p'] = pack('H*', self::DH_DEFAULT_PRIME);
        $details['g'] = pack('H*', self::DH_DEFAULT_GENERATOR);
        $this->dh = openssl_pkey_new(array(
            'dh' => $details,
        ));
        if ($this->dh) {
            return true;
        } else {
            error('OpenSSL failed to export your private key, ensure you have a valid configuration file, and PHP can find it.');
        }
    } else {
        $this->dh = openssl_pkey_get_private($priv_key);
        return false;
    }
}

関数の最初の実行

エクスポートされた秘密鍵の取り消し

両方の画像のボタンにある Ag== は、base64 でエンコードされた dh['g'] の値です。

次に、生成された秘密鍵をデータベースに保存して永続化します。これにより、後で openssl_pkey_get_private 関数を使用して鍵を再作成できます。

ただし、返された openid.dh_server_public をアソシエーション リクエストから取得して渡し、秘密キーからキーを再作成すると、

var_dump(openssl_dh_compute_key($this->op_pubkey, $this->dh));
4

1 に答える 1

4

よし、後で問題に戻ることについて彼らが何を言っているか知っているだろう. 私の「個人的な」コードはすべて問題ありませんでした.openssl_dh_compute_keyが公開鍵に期待していたものと、OPの公開鍵がどのように渡されるかについての誤解でした...

dh_server_public
   Value: base64(btwoc(g ^ xb mod p))
   Description: The OP's Diffie-Hellman public key.

それで、それを4回目か5回目に読み直したとき、ようやくクリックしました。

「ねえ、私のキーがバイナリ形式なら、openssl 関数はバイナリを想定していると思います..」

そのため、欠落している追加のステップはbase64デコードになりました...

openssl_dh_compute_key(base64_decode($this->op_pubkey), $this->dh);
于 2012-06-19T13:37:29.817 に答える