ゆずめも

メモ的なブログです。主に勉強した事について書いてます。

公開鍵暗号方式でphpを使って暗号化と復号を試した

仕事で公開鍵渡すので〜と言われ、仕組みは知ってるがやったことなかったので
opensslで鍵を作成して、今仕事で使っているPHPを使ってメッセージの暗号化、復号を試したので自分用のメモ

鍵を作る

まずは以下の記事を参考に秘密鍵と公開鍵を作る

qiita.com

#  private key
openssl genrsa 1024 > private-key.pem

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

ディレクトリ構成

key_check
├── decrypt.php
├── encrypt.php
├── private-key.pem
└── public-key.pem

phpのコード

Encrypt

まずは公開鍵を使用して「まいやんが世界一かわいい」*1というメッセージを暗号化する。

<?php // encrypt.php
$msg = 'まいやんが世界一かわいい';

// 鍵情報の読み込み
$keyPath = dirname(__FILE__).'/public-key.pem';
$key = file_get_contents($keyPath);

// 結果が$crypted変数に入っている
openssl_public_encrypt($msg, $crypted, $key);

// $cryptedに入っているのはバイナリなのでbase64して表示する
echo base64_encode($crypted).PHP_EOL;

openssl_public_encryptの仕様

http://php.net/manual/ja/function.openssl-public-encrypt.php

Decrypt

それで表示された文字をdecrypt.phpでデコードする

<?php // decrypt.php
$msg = '/* ここにencrypt.phpの結果として表示されたものを入力する */';

// 鍵情報の読み込み
$keyPath = dirname(__FILE__).'/private-key.pem';
$key = file_get_contents($keyPath);

$decodeBody = base64_decode($msg);

// 結果が$decrypted変数に入る
openssl_private_decrypt($decodeBody, $decrypted, $key);

echo $decrypted . PHP_EOL; // => "まいやんが世界一かわいい"

openssl_private_decryptの仕様

http://php.net/manual/ja/function.openssl-private-decrypt.php

まとめ

検索すると以外と簡単にできるんですね
ただ普段PHPを触ってないので、毎回file_get_contentsの結果ってどこに保持しておくべきなのかとかよくわからないです。。

たぶんこの案件が終わるとまたPHP触らなくなってしまうので、言語ではなく暗号についてちょっと勉強したい気持ちは出てきたので、積本消化したら次は暗号技術入門とか買ってみようかと考えてます

暗号技術入門 第3版

暗号技術入門 第3版

  • 作者:結城 浩
  • 発売日: 2015/08/26
  • メディア: 単行本