Php 用于OpenID的Diffie-Hellman密钥的共享秘密计算问题

Php 用于OpenID的Diffie-Hellman密钥的共享秘密计算问题,php,openssl,openid,Php,Openssl,Openid,我试图为OpenID创建一个有状态库,用作Wordpress插件,当我试图使用openssl函数计算秘密值时遇到了一个问题。好奇是否有人有一些我可以尝试的步骤,提示等 谢谢 常数 const DH_DEFAULT_PRIME = "dcf93a0b883972ec0e19989ac5a2ce310e1d37717e8d9571bb7623731866e61ef75a2e27898b057f9891c2e27a639c3f29b60814581cd3b2ca3986d2683705577d45c2

我试图为OpenID创建一个有状态库,用作Wordpress插件,当我试图使用openssl函数计算秘密值时遇到了一个问题。好奇是否有人有一些我可以尝试的步骤,提示等

谢谢

常数

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==是dh['g']的base64编码值

然后,我将生成的私钥保存到一个数据库中以保存,这允许我稍后通过openssl_pkey_get_private函数重新创建密钥

但是,从关联请求中获取返回的openid.dh_server_public并传递它,以及从私钥中重新创建的我的密钥会导致错误的for

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

好吧,你知道他们说什么关于稍后再回到一个问题。我所有的“个人”代码都很好,这是对openssl_dh_compute_密钥期望公钥的误解,以及OP的公钥是如何传递的

dh_server_public
   Value: base64(btwoc(g ^ xb mod p))
   Description: The OP's Diffie-Hellman public key.
所以,当我第四次或第五次重读它时,它终于点击了

“嘿,如果我的密钥是二进制形式,我打赌openssl函数需要二进制…”

因此,额外缺少的步骤最终是base64解码

openssl_dh_compute_key(base64_decode($this->op_pubkey), $this->dh);

我真希望这个函数有更好的文档记录!:\现在是。。。看见