大化通信

大化物流開発合同会社の社員から技術発信をしていきます

phpseclibでRSA公開鍵暗号方式の暗号化と復号

こんにちは、大化社員のkannaです。
今回はRSA公開鍵暗号方式の暗号化と復号をPHPのライブラリ「phpseclib」を使用して行ったのでそれについて記事にしました。

以前携わった案件にてパスワード保護付きのPDFを扱う際に、
フロントからPDFと暗号化したパスワードを受け取りPHPで処理を行う必要があったためこちらのライブラリを使用しました。

概要

OpenSSLを使用して秘密鍵と公開鍵を作成し
PHPのライブラリ「phpseclib」で暗号化と復号を行う

環境

本記事での環境は以下

  • Windows 10

  • PHP 8.1.2

  • "phpseclib/phpseclib": "^3.0"

OpenSSLのコマンドで鍵を生成

秘密鍵の生成

下記コマンドで秘密鍵を生成します

openssl genrsa -out private-key.pem 2048

openssl genrsa -out 秘密鍵ファイル名 ビット数

ビット数は鍵のサイズとなります。
サイズが大きいほど鍵の強度は高くなりますが、復号の際の解読時間が長くなります。

秘密鍵から公開鍵を生成

下記コマンドで秘密鍵から公開鍵を生成します

openssl rsa -in private-key.pem -pubout -out public-key.pem

openssl rsa -in 秘密鍵ファイル名 -pubout -out 公開鍵ファイル名

先ほどのコマンドで生成した秘密鍵ファイルを指定します。

phpseclibを使用し、文字列の暗号化と復号を行う

暗号化

use phpseclib3\Crypt\PublicKeyLoader;

$text = '暗号化したい文字列';
// 公開鍵ファイルを読み込み
$public = file_get_contents('/path/to/public-key.pem');
$publicKey = PublicKeyLoader::load($public);
// 引数に指定した文字列を暗号化
$encrypted = $publicKey->encrypt($text);

$public = file_get_contents('/path/to/public-key.pem');

file_get_contents()で公開鍵ファイルの値を取得します。

$publicKey = PublicKeyLoader::load($public);

PublicKeyLoader::load()を使い、公開鍵を読み込みます。

$encrypted = $publicKey->encrypt($text);

encrypt()で指定した文字列を暗号化します。

復号

use phpseclib3\Crypt\RSA;

// 秘密鍵ファイルの読み込み
$private = file_get_contents(storage_path('test_private-key.pem'));
$privateKey = RSA::loadPrivateKey($private);
// 引数に指定した文字列を復号
$decrypted = $privateKey->decrypt($encrypted);

echo '復号した文字列:'.$decrypted;

$privateKey = RSA::loadPrivateKey($private);

RSA::loadPrivateKey()を使い、秘密鍵を読み込みます。

$decrypted = $privateKey->decrypt($encrypted);

decrypt()で指定した文字列を復号します。

phpseclibを使用して鍵を生成する場合

use phpseclib3\Crypt\RSA;

// 秘密鍵を生成
$private = RSA::createKey();
// 秘密鍵から公開鍵を生成
$public = $private->getPublicKey();


phpseclibを使ったRSA公開鍵暗号方式の暗号化と復号については以上になります。
読んでくださってありがとうございます。
参考になれば幸いです。

参考サイト

Opensslコマンドで秘密鍵と公開鍵を生成

weblabo.oscasierra.net

www.ibm.com

phpseclib

phpseclib.com