当前位置: 首页 > 后端技术 > PHP

PHP和C++RSA加解密问题记录

时间:2023-03-29 22:18:03 PHP

RSA非对称加密在网络认证中用的比较多。当PHP和C++与身份验证交互时,我也遇到了问题。在解决问题的过程中,发现网上对相关问题的描述非常少,所以记录在这里,希望对遇到类似问题的朋友有所帮助。问题场景:由于项目需求,需要提供PHP编写接口供C++调用。接口返回数据前,需要对访问者进行身份验证,增加数据访问的安全性。根据要求,我们使用两次握手来完成认证。第一次访问接口不带参数,接口返回token和RSA公钥(公钥经过base64加密,方便传输)。第二次访问接口时,客户端需要使用返回的公钥对访问参数进行加密,然后将加密后的参数和token发送给服务端进行校验。服务器收到访问数据后,用私钥对加密后的参数进行解密,检查参数是否符合要求,完成认证过程。当第二次访问时发送的加密参数无法通过私钥解密时,我们的问题就出现了。注意:公钥和私钥由PHP生成。使用这对公钥和私钥就可以在PHP端完成加解密。使用相同的公钥和私钥也可以在C++端完成加解密,但是两者互通会有问题。解决方案:直奔正确的想法。我们用同一个公钥加密同一个参数后,发现两者的长度相差很大,所以我们判断两者加密后的编码方式应该不同。据我所知,RSA加密后,C++端应该是输出十六进制密文,而PHP使用openssl_public_encrypt公钥加密后的密文应该是ASCII码字符串,两者的长度相差很大。根据上面的判断,C++发送给PHP的16进制密文是16进制密文,而使用openssl_private_decrypt解密需要ASCII码字符串,当然是解不出来的。既然知道了问题,我们就可以通过将16进制密文转换成ASCII码字符串来解决问题,所以我们在PHP端使用pack("H*",param)对密文进行转码,顺利解密。关于pack函数的详细介绍,可以看OSC上朋友的博客。链接在这里简单总结一下:1.使用pack("H*")2.PHPbase64加密公钥给C++3.C++使用公钥加密信息post传给PHP解密