勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

PHP7 / 8でBlowfishアルゴリズムを用いた暗号化と復号化方法

  PHP

大分前にPHPでPearのCrypt_Blowfishパッケージを使用し、Blowfishアルゴリズムを用いた暗号化と復号化方法というのをメモしたが、PHP8の環境で使おうとするとエラーになる。どうもPHP7で非推奨になったみたい。そのため当該パッケージは使わずBlowfishアルゴリズムで暗号・復号化する方法をメモ。

 

対応方法

ソースコード

パスフレーズと初期化ベクトルは適宜変更すること。

<?php
define('PASSPHRASE', 'xxxxxxxxxx'); //パスフレーズ
define('VECROT', 'xxxxxxxxxx'); //初期化ベクトル
define('CIPHER_ALGO', 'bf-cbc'); //暗号メソッド

function passwordEncrypt($target){

    if( $m = strlen($target) % 8){
        $target .= str_repeat("\x00", 8 - $m);
    }

    $encrypt = openssl_encrypt(
        $target,
        CIPHER_ALGO,
        PASSPHRASE,
        OPENSSL_RAW_DATA | OPENSSL_NO_PADDING,
        VECROT,
    );

    return base64_encode($encrypt);
}

function passwordDecrypt($target){

    $decrypt = trim(
        openssl_decrypt(
            base64_decode($target),
            CIPHER_ALGO,
            PASSPHRASE,
            OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,
            VECROT,
        )
    );

    return $decrypt;
}

$target = '暗号化したい文字列';

$test_encrypt = passwordEncrypt($target);
var_dump($test_encrypt); //string(44) "ef79hQpAM4ufxg1VB9dfSoG5wEQMt2f95k2omAe1azk=" 

$test_decrypt = passwordDecrypt($test_encrypt);
var_dump($test_decrypt); //string(27) "暗号化したい文字列" 

 

リファレンス

openssl_encrypt

https://www.php.net/manual/ja/function.openssl-encrypt.php

openssl_decrypt

https://www.php.net/manual/ja/function.openssl-decrypt.php

 

参考サイト

https://qiita.com/junk168/items/da2d8f73e388d6686776

https://qiita.com/Uchikoba/items/7784e1f1eb7bae3b1593

 - PHP

  関連記事

バニラPHPでフラッシュデータ(フラッシュメッセージ)機能を実装する方法

PHPフレームワークのCodeIgniterを勉強していた際にページ遷移好みに表 ...

PHPでmysqli関数使用時のプリペアドステートメントの利用方法

PHPでMySQLを扱う際はmysqli関数を、エスケープの際はreal_esc ...

PHPからCSVファイルを出力する際にメモリを節約する方法

MySQLよりデータを大量に取り出してCSVファイル化し、ダウンロードさせるとい ...

PHPでCookie保存時にHttpOnly / Secure属性を設定する方法

あるシステムのセキュリティ対策としてCookie保存時にHttpOnly / S ...

LINEのURLプレビューを表示させないようPHP側で制御する方法

公開中の特定のページのみLINEのURLプレビューを表示させないよう制御したいと ...