ホームページ  >  記事  >  バックエンド開発  >  PHP で AES-128-CBC-PKCS5Padding 暗号化を実装する方法を詳しく説明した記事

PHP で AES-128-CBC-PKCS5Padding 暗号化を実装する方法を詳しく説明した記事

藏色散人
藏色散人転載
2021-09-01 15:49:065415ブラウズ

私は最近、仕事で API のドッキングを担当しています。データ インターフェイスのやり取りのプロセス中に、一部の機密データが送信されることは避けられません。データのやり取りをより安全にするために、データは暗号化されます。 。

相手側の要求は、インターフェイスのビジネス データを AES-128-CBC-PKCS5Padding 暗号化し、その後 Base64 エンコードして最終文字列を送信することです。 、暗号化方式に対応するキーと初期化ベクトル (オフセット) も与えられます。

この暗号化方式を初めて知り、対応する暗号化関数がないかPHP関数ライブラリで検索しましたが、調べてみると存在せず、自分で実装する必要がありました。後で知りましたが、mcrypt 関数拡張で実装できるのですが、mcrypt 関数は PHP 7.1.0 以降廃止されました。この関数を使用しないことを強くお勧めします。他の暗号化関数ライブラリを探す必要があります。 openssl_encrypt (暗号化されたデータ) 関数の検出を理解することで、要件を満たすことができます。openssl_encrypt の具体的な使用方法については、マニュアルをお読みください [推奨: PHP ビデオ チュートリアル #]

実装関数は次のとおりです:

  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 にしてデバッグし、最終的に共同デバッグに合格したことがわかりました。しかし、具体的な技術的な詳細はあまり明確ではありません。次のように修正して使用します。まずはこれを見て、それから時間があるときに勉強してください。

以上がPHP で AES-128-CBC-PKCS5Padding 暗号化を実装する方法を詳しく説明した記事の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。