openssl_encrypt 加密解密

DES 是對稱性加密裏面常見一種,全稱爲 Data Encryption Standard,即數據加密標準,是一種使用密鑰加密的塊算法。密鑰長度是64位(bit),超過位數密鑰被忽略。所謂對稱性加密即加密和解密密鑰相同,對稱性加密一般會按照固定長度,把待加密字符串分成塊,不足一整塊或者剛好最後有特殊填充字符。

跨語言做 DES 加密解密經常會出現問題,往往是填充方式不對、編碼不一致或者加密解密模式沒有對應上造成。
常見的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。
加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB


一、加密用到的方法:

openssl_encrypt($data, $method, $password, $options, $iv)

參數說明:

1.$data 加密明文

2.$method 加密方法: DES-ECB    DES-CBC   DES-CTR   DES-OFB   DES-CF

3.$passwd 加密密鑰[密碼]

4.$options 數據格式選項(可選)【選項有:】:0   OPENSSL_RAW_DATA=1    OPENSSL_ZERO_PADDING=2

   OPENSSL_NO_PADDING=3
5.$iv 密初始化向量(可選)

需要注意:如果method爲DES−ECB,則 method爲DES-ECB,則method爲DES−ECB,則iv無需填寫


二、解密用到的方法:
 

openssl_decrypt($data, $method, $password, $options, $iv)

參數說明:

1.$data 要解密的數據
  其他參數同加密方法


三、用法案例:
參數:

  $data = '1234567887654321';//加密明文
   $method = 'DES-ECB';//加密方法
   $passwd = '12344321';//加密密鑰
   $options = 0;//數據格式選項(可選)
   $iv = '';//加密初始化向量(可選)

(1) 默認填充方式:
加密:

$result = openssl_encrypt($data, $method, $passwd, $options);
var_dump($result);

結果:

string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg"

解密

$result = 'kQYOdswcm9I5elv2wdJucplqAgqDNqXg';
var_dump(openssl_decrypt($result, $method, $passwd, 0));

結果:

string(16) "1234567887654321"

(2) OPENSSL_RAW_DATA方式【會用PKCS#7進行補位】
加密

$result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA);
var_dump($result);

結果:

string(24) "�v���9z[���nr�j �6��"

我們可以看到結果是亂碼的,這時我們需要base64一下

$result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA);
var_dump(base64_encode($result));

這時結果是

string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg"

解密

result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA);
var_dump(openssl_decrypt($result, $method, $passwd,OPENSSL_RAW_DATA));

結果:

string(16) "1234567887654321"

我們可以看到:默認填充方式與OPENSSL_RAW_DATA,這兩種方式加密結果是一樣的

(3) OPENSSL_ZERO_PADDING方式
看字面意思,是用0填充,但是測試並不起作用

加密

$result = openssl_encrypt($data, $method, $passwd, OPENSSL_ZERO_PADDING);
var_dump($result);

結果:

string(24) "kQYOdswcm9I5elv2wdJucg==" 

解密:

$result = openssl_encrypt($data, $method, $passwd, OPENSSL_ZERO_PADDING);
var_dump(openssl_decrypt($result, $method, $passwd,OPENSSL_ZERO_PADDING));

結果:

string(16) "1234567887654321"

(4) OPENSSL_NO_PADDING【不填充,需要手動填充】
在openssl_encrypt前加上填充過程

加密

  $str_padded = $data;
  if (strlen($str_padded) % 16) {
      $str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");
  }
  $result = openssl_encrypt($str_padded, $method, $passwd, OPENSSL_NO_PADDING);
  var_dump($result);
  echo '<br>';
  var_dump( base64_encode($result));

結果:

string(16) "�v���9z[���nr" 
string(24) "kQYOdswcm9I5elv2wdJucg=="

我們可以看到結果是加密的亂碼,需要用base64一下,就可以看到結果了

解密:

 //加密begin
  $str_padded = $data;
  if (strlen($str_padded) % 16) {
      $str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");
  }
  $result = openssl_encrypt($str_padded, $method, $passwd, OPENSSL_NO_PADDING);
  //加密end
 //解密begin
 $str = base64_encode($result);
 $m = openssl_decrypt( base64_decode($str) , $method, $passwd, OPENSSL_NO_PADDING);
 var_dump( rtrim( rtrim( $m,chr(0) ), chr(7) ) );
 //解密 end

結果:

string(16) "1234567887654321"

** 結尾要去除填充字符’\0’和’\a’。
‘\a’是爲了兼容用OPENSSL_RAW_DATA加密的結果。 **

參照的文檔有:


PHP 基礎篇 - PHP 中 DES 加解密詳解
https://www.jianshu.com/p/546137b8ac7a

關於mcrypt_encrypt和openssl_encrypt加密結果不一致的解決
http://www.heylc.com/fuanyuopenssl.html

相關知識文章
RSA密碼傳輸加密方案
https://wenku.baidu.com/view/83cb1d6df011f18583d049649b6648d7c1c7089d.html?re=view
iOS 實現對稱加密多種填充方式(ANSIX923、ISO10126、Zero)
https://www.jianshu.com/p/7b6f5aaa7680
PHP由mcrypt擴展加密改爲openssl擴展加密
https://www.xxling.com/blog/article/3114.aspx
PHP用openssl_encrypt代替mcrypt_encrypt
https://coderlife.cn/1624.html
AES加密CBC模式兼容互通四種編程語言平臺【PHP、Javascript、Java、C#】
https://my.oschina.net/Jacker/blog/86383
在PHP7.1中使用openssl取代mcrypt
https://swoole.app/2018/05/15/在php7-1中使用openssl取代mcrypt/
PHP openssl加密擴展使用總結
https://www.bbsmax.com/A/ke5jNDe75r/
PHP 7.2+使用openssl進行加解密
https://www.lytit.com/2018/01/26/118/
PHP OpenSSL擴展 - 對稱加密
https://www.jianshu.com/p/8f82e8fd123e
DES 加解密工具
http://tool.chacuo.net/cryptdes
RSA填充方式
https://www.jianshu.com/p/205abb4b9dc6
AES加密模式和填充方式,hash,md5,ca
http://blog.sina.com.cn/s/blog_679daa6b0100zmpp.html
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章