为了账号安全,请及时绑定邮箱和手机立即绑定

关于php中openssl_public_encrypt无填充的一个注意事项

标签:
PHP

昨天在使用openssl_public_encrypt函数rsa加密一些数据传输的时候,怎么都是加密失败。

if (openssl_public_encrypt($data, $encrypted, $this->pubkey, OPENSSL_NO_PADDING)){

$data = base64_encode($encrypted);

}else {

$data = '';

}return $data;

把填充模式换成默认的话是加密成功的,我百度到的资料都是说加密的数据的长度问题,但我的数据是不定长度,而且对应接口使用的解密方式也固定是OPENSSL_NO_PADDING无填充方式,不能使用默认的填充模式。后面终于让我在Stack Overflow上找到一个相同的问题 PHP RSA encrypt with OPENSSL_NO_PADDING mode, return false - Stack Overflow

最好配合这篇文章blog食用 rsa加密--选择padding模式需要注意的问题。。。 - 饮识止渴 - 博客园

大致说明一下出现问题的原因,不一定完全准确,各位看官大概理解就好,在java(Android)中rsa加密选择无填充模式如果不足128字节的话,调用方法会自动帮你将数据用0(还是空格?)填充至128字节再进行加密,但php跟java中没有统一的填充标准,所以openssl_public_encrypt中并没有帮我们做这一件事情,rsa又对加密数据长度有要求(这个与钥模有关),从而导致加密失败,这就需要我们自己手动去填充了。可以使用php函数str_pad

$data=str_pad($data, 128);

默认填充空格,加密后反过来也解密成功了。

             

作者:菜six岁

链接:https://www.jianshu.com/p/02c5776607c5

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号

举报

0/150
提交
取消