昨天在使用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