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

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

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

$data = base64_encode($encrypted);

}else {

$data = '';

}

return $data;

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

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

  大体说明一下出现问题的缘由,不必定彻底准确,各位看官大概理解就好,在java(Android)中rsa加密选择无填充模式若是不足128字节的话,调用方法会自动帮你将数据用0(仍是空格?)填充至128字节再进行加密,但php跟java中没有统一的填充标准,因此opensslpublicencrypt中并无帮咱们作这一件事情,rsa又对加密数据长度有要求(这个与钥模有关),从而致使加密失败,这就须要咱们本身手动去填充了。能够使用php函数str_pad函数

$data=str_pad($data, 128);

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

相关文章
相关标签/搜索