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


  昨天在使用openssl_public_encrypt函數rsa加密一些數據傳輸的時候,怎么都是加密失敗。

1         if (openssl_public_encrypt($data, $encrypted, $this->pubkey, OPENSSL_NO_PADDING)){
2             $data = base64_encode($encrypted);
3         }else {
4             $data = '';
5         }
6         return $data;

  把填充模式換成默認的話是加密成功的,我百度到的資料都是說加密的數據的長度問題,但我的數據是不定長度,而且對應接口使用的解密方式也固定是OPENSSL_NO_PADDING無填充方式,不能使用默認的填充模式。后面終於讓我在Stack Overflow上找到一個相同的問題 https://stackoverflow.com/questions/36001858/php-rsa-encrypt-with-openssl-no-padding-mode-return-false

  最好配合這篇文章blog食用 https://www.cnblogs.com/lzl-sml/p/3501447.html 

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

$data = str_pad($data, 128);

默認填充空格,加密后反過來也解密成功了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM