menu
書いてる野郎
orebike@gmail.com
ネットで検索に引っかかってくるものは、非常に短い文字列を対象にしているが、長い文字列に対してはこのように対処する。
そもそも、公開鍵でかける暗号化は長いデータを暗号化するような目的で作られていないので、長い文字列に対して操作するとパフォーマンスが悪い
$src = "hogehogehoge....."; // 非常に長い文字列 $vList = str_split($src, 10); // openssl_public_encrypt 関数はブロック長よりも長い文字列は暗号化できないので短めに分割する $key = file_get_contents(__DIR__ .'/public-key.pem'); // キーを読み込む $result = array(); foreach ($vList as $v) { openssl_public_encrypt($v, $crypted, $key); // 暗号化されたバイナリが参照経由で $crypted に格納される $result[] = base64_encode($crypted); // バイナリをbase64 でアスキー表現に変換して格納 }
秘密鍵と公開鍵はこのようにコマンドで生成した
$ openssl genrsa 1024 > private-key.pem $ openssl rsa -in private-key.pem -pubout -out public-key.pem
↑で暗号化したデータを改行区切りでファイルに保存したとすると以下のようなコマンドで復元することができる
$ cat hoge.dat | while read line; do echo $line | base64 -d | openssl rsautl -decrypt -inkey private-key.pem; done