首页 新闻 赞助 找找看

在PHP中如何通过公钥进行数据验证!

0
悬赏园豆:50 [已解决问题] 解决于 2012-07-10 17:25

现有代码如下:

 $sign='6945763ca31366d57c69e5aec4367d911abbba2b0918ae0e82e9e54dceb6a99c76895ad192850da8c2f12d2c320b1898dd5a3970901e6cc77301ceffe7a33104ef4d9bd5890c4be76d7e87bd5d2aca6fb8d9ea47ee9c49379f61b1cb41ffc18e6997bc4f77326cf0049f593a0153e77d3e8bbba765307bad46c91183c367daf1aa6650ad5a07f8135d6579ff644a20e061501d665c5557fa61324c0be5b1f7494b297e3207c790ae64ab8653571e3efc4905aff0078aed71e75d1449a334c4c93d6db240de01b3cd71a78c23bf7069cd35f4b93f3aaa63cefa8d52f85141dee8bba07b3c888a6e31696f4f4a75f2228d2951a786950c56f2cf49a92197b0ce83';
 $data='123456789';
 $fp=fopen("./allinpay-pds.pem","r");
 $pub_key=fread($fp,8192);
 echo '公钥 ',$pub_key;
 fclose($fp);

 $pub_key_id=openssl_get_publickey($pub_key);
 
 $verify_result=openssl_verify($data,$sign,$pub_key_id);
 openssl_free_key($pub_key_id);
 while ($msg = openssl_error_string())
     echo $msg . "<br />\n";
 
 echo $verify_result;
 if($verify_result==1){
     echo "OK";
 }else{
     echo "bad";
 }

 

但是在执行的时候出现错误error:04091077:rsa routines:INT_RSA_VERIFY:wrong signature length

php
tonnychina的主页 tonnychina | 初学一级 | 园豆:151
提问于:2012-01-04 15:50
< >
分享
最佳答案
0

对读取出来公钥进行base64解码

tonnychina | 初学一级 |园豆:151 | 2012-07-10 17:24
其他回答(1)
0

OpenSSL可以记录多个错误'项',所以你应该循环: 
((ERR = ERR_get_error())!= 0) 
ERR_error_string(ERR,BUF),放(ERR); / /或类似
或只是调用ERR_print_errors _fp循环
只要你想输出一个BIO或FILE *。 

当你提供一个缓冲ERR_error_string,其返回值
始终指向该缓冲区,所以你不要需要单独szError的。 
和,技术上sslerror应该是'长',以确保32位, 
但在实践中,很少有系统现在有16位整型, 
和那些可能不支持openssl的反正。 

 

这是什么错误意味着: 
>错误:04091068:RSA例程:INT_RSA_VERIFY:坏签名

这意味着一个RSA签名未验证,特别是, 
“解密”后(Y ^ D mod n)的结果是不
预计哈希(SSL协议的签字)或
正确的预期哈希编码(否则)。 

你说这个握手过程中发生的,只有RSA 
核查应该是握手期间可能是: 
(CLI)CertVerify“ARSA客户端的认证
(以上的ERR_get_error循环会显示这) 

如果损坏过境PKCS1签名(包) 
填充将赶上这个以压倒性的概率
(东西像2 ^ 80到1,我不记得确切) 
因此无论是等软件不计算将要签署
值或签名正确,或你正在使用的OpenSSL 
有一个严重的错误,影响旁若无人 - 不大可能, 
除非你已经修改了它,或片状工具
或片状机上执行;或服务器(处理
CLI-CertVerify)也许你有一些代码,也许在一个回调, 
已损坏的OpenSSL的握手检查计算。 
(同行可以计算签名错误的方法之一是,如果
它被赋予的私钥和证书不匹配。 
OpenSSL会检查这一点,但没有其他的软件可能。) 

这到底是连接你,你的密码组(S) 
你选择,你使用的客户端认证,什么是
您使用的是另一端,OpenSSL版本? 

你可以尝试命令openssl的指令主要或s_server 
从相同的同行(?),(至少),看到是否
它得到了同样的错误,正是在序列? 

收获园豆:50
半夜未眠 | 园豆:295 (菜鸟二级) | 2012-03-04 00:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册