PHP 實現 AES-128-CBC-PKCS5Padding 加密

Aliliin發表於2021-09-01
  • 最近在工作中負責對接 API,資料接⼝互動過程中,不可避免會有⼀些敏感資料的傳輸,為了使資料互動更加安全,因此對資料進行加密。對方的要求是對介面的業務資料進行 AES-128-CBC-PKCS5Padding 加密,然後再做 Base64編碼將得到的最終字串進行提交,也給到了加密方式對應的金鑰(key)和初始化向量(偏移量)。

  • 首先看到這個加密方式之後,就在PHP函式庫中進行尋找,看看有沒有對應的加密函式,然而找了一圈下來,發現並沒有,需要自己實現,後瞭解到可以用 mcrypt 函式擴充套件實現,但是 mcrypt函式 自 PHP 7.1.0 起就廢棄了,強烈建議不要使用本函式,只好再尋找其他加密函式庫,在手冊的下方看到了 OpenSSL 函式,通過了解 openssl_encrypt(加密資料) 函式發現可以實現需求,openssl_encrypt 具體的使用方法請自行看手冊,

  • 實現函式如下:

      function encrypt($input, $key, $iv){
          return base64_encode(openssl_encrypt($input, 'AES-128-CBC', $key, OPENSSL_RAW_DATA,$iv));
      }
    
      // 解密
      function decrypt($input, $key, $iv){
          return openssl_decrypt(base64_decode($input), 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv);
      }
    
      // 測試加密 (我這裡用的是json字串)
      $dataJson = '[{"Code": "123123", "Name": "Bob", "Address": "\u94f6\u5ddd\u5e02"}, {"Code": "464776", "Name": "Hello", "Address": "\u5317\u4eac\u5e02"}]';
      print_r(encrypt($dataJson, $key, $iv));
      //u9Bd8oHXDGvjZcTIX9HK1r1q+aSu+/48gsfoGVrxoScZuX8yaj/xco8F2yHt2T987JNHil9LwjAmu9o5NJaicWQDaiKwMD5o70k1A9bGjDd71xb4hXRx3ddZwI85oTQQEUQLadR5C759SdaN8AOxlzH+yGlAWTOaEleulKoRTwaknG1NCM/qIRQ8gI5lzv+D
    
      // 測試解密
      $strr = 'u9Bd8oHXDGvjZcTIX9HK1r1q+aSu+/48gsfoGVrxoScZuX8yaj/xco8F2yHt2T987JNHil9LwjAmu9o5NJaicWQDaiKwMD5o70k1A9bGjDd71xb4hXRx3ddZwI85oTQQEUQLadR5C759SdaN8AOxlzH+yGlAWTOaEleulKoRTwaknG1NCM/qIRQ8gI5lzv+D';
      print_r(decrypt($strr, $key, $iv));
      // [{"Code": "123123", "Name": "Bob", "Address": "\u94f6\u5ddd\u5e02"}, {"Code": "464776", "Name": "Hello", "Address": "\u5317\u4eac\u5e02"}]
  • 自測通過,一臉得意地坐等聯調。然後開始寫其他業務去了,過了幾天,結果一聯調發現我加密的對方無法解密,對方加密的我無法解密,加密演算法不匹配(撓頭中。經過Google搜尋相關問題,發現一句話,大概的意思就是說,在廢棄的 mcrypt加密庫中,128實際上指的是塊大小而不是金鑰大小,但是在 openssl 中的 aes-128-cbc 的128 指的是金鑰大小,也就是說,在使用有效的256位金鑰時,它們都是aes-256,而如果要把 mcrypt 轉為 openssl 的加密方式,mcrypt 的128 需要寫成 openssl 的 256 ,於是抱著試試看的態度,更改了一下 aes-128-cbc 為 aes-256-cbc,然後進行除錯,最後發現聯調通過了。不過具體的技術細節原理還不是很明白,先這樣子修改使用,以後有時間再研究吧。

> **解決的方案,是把加密方式 AES-128-CBC 替換成 AES-256-CBC**
本作品採用《CC 協議》,轉載必須註明作者和本文連結
高永立

相關文章