關於php中openssl_public_encrypt無填充的一個注

petterchx發表於2021-09-09

昨天在使用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上找到一個相同的問題

最好配合這篇文章blog食用

大致說明一下出現問題的原因,不一定完全準確,各位看官大概理解就好,在java(Android)中rsa加密選擇無填充模式如果不足128位元組的話,呼叫方法會自動幫你將資料用0(還是空格?)填充至128位元組再進行加密,但php跟java中沒有統一的填充標準,所以openssl_public_encrypt中並沒有幫我們做這一件事情,rsa又對加密資料長度有要求(這個與鑰模有關),從而導致加密失敗,這就需要我們自己手動去填充了。可以使用php函式str_pad

$data=str_pad($data, 128);

預設填充空格,加密後反過來也解密成功了。

             

作者:菜six歲

連結:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4606/viewspace-2810848/,如需轉載,請註明出處,否則將追究法律責任。

相關文章