我正在尝试为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 ==是dh ['g']的base64编码值。
然后我将生成的私钥保存到数据库中以保留,这允许我稍后通过openssl_pkey_get_private函数重新创建密钥。
但是,从关联请求中获取返回的openid.dh_server_public并传递它,并从私钥重新创建我的密钥会导致错误
var_dump(openssl_dh_compute_key($this->op_pubkey, $this->dh));
答案 0 :(得分:4)
好吧,你知道他们后来回到问题所说的话。我的所有“个人”代码都很好,这是对openssl_dh_compute_key对公钥的期望以及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);