これまで使っていた Crypt_RSA という暗号化用の PHP パッケージが PHP ver7.0 で動かなくなりました。$obj = &new Crypt_RSA();
というような記述で引っかかっています。& は参照だそうですが,何かによると & と new は同時に使えなくなったようです(重複するとかなんとか)。試しに new の前の & をすべて消したら,動き始めました。ただもはやメンテナンスがされていないようなので,他のものに変更した方が良いです。
phpseclib というパッケージを使用してみます。インストール方法はこちらのサイトを参考にしました。
pear channel-discover phpseclib.sourceforge.net
pear remote-list -c phpseclib
pear install phpseclib/Crypt_RSA
(sudo で作業しました。2番目のコマンドでエラーが出たのですが?)ファイルの配置場所は /usr/share/php/ の中です。関連して,他のパッケージも入りました。
pear list とコマンドを打ってみても、 phpseclib は表示されません。
Installed packages, channel pear.php.net:
=========================================
Package Version State
Archive_Tar 1.4.0 stable
Console_Getopt 1.4.1 stable
PEAR 1.10.1 stable
PEAR_Manpages 1.10.0 stable
Structures_Graph 1.1.1 stable
XML_Util 1.3.0 stable
以下、使用してみました。まずは鍵の作成です。設定が色々あるようなのですが、良く分からない。下記の例では、鍵の長さは 512 ですが、実施に使用するときには 1024 以上が良いのではないかと思います。
<?php
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
//$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
//$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
//define('CRYPT_RSA_EXPONENT', 65537);
//define('CRYPT_RSA_SMALLEST_PRIME', 64); // makes it so multi-prime RSA is used
$keyary = $rsa->createKey(512); // == $rsa->createKey(1024) where 1024 is the key size
$privatekey = $keyary["privatekey"];
$publickey = $keyary["publickey"];
echo $privatekey."\n";
echo $publickey."\n";
?>
$keyary は配列です。出力画面は、こんな感じです。
-----BEGIN RSA PRIVATE KEY-----
MIIBOwIBAAJBAL9UkhoNX2YQ8OEnKujcNe8Lvase86M39U6/DB0cJDt3EIbeOr3K
IGpMc99/QwLCGAVB4Ojrm8hmCXQg4nNv4jcCAwEAAQJAEYkYPOAF4s5hrVkQIzhv
jwGl+AWFsetihb2XyCE4puRpi9z5E6Z6ENsBw+CqOeg6zZL8mA9YFv9FuombOgQS
HQIhAOy+GQgQv1UslCiZSq/2EXiXgBoHSeGYCfLrVYnbzCUzAiEAzuTQUw/w1C1f
MNVJDJQur2t24rBzSS/7ZNCjYMqkxu0CIQC8X4plW4YSzNTa9RZzqrU+IjZg/5mu
8p4/9zdp6UWn9wIhALxwRZpR24y1Yo0MxkLxuG/H1nl0MxzG2hchvJzNFTWlAiA0
b91DrJ+xY1CetMKUn8QusIXH65OnjpEi4lTWmDnoFA==
-----END RSA PRIVATE KEY-----
-----BEGIN PUBLIC KEY-----
MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAL9UkhoNX2YQ8OEnKujcNe8Lvase86M3
9U6/DB0cJDt3EIbeOr3KIGpMc99/QwLCGAVB4Ojrm8hmCXQg4nNv4jcCAwEAAQ==
-----END PUBLIC KEY-----
このキーの形は PEM と言うらしいです。次に、エンコードとデコードをしてみます。
<?php
include('Crypt/RSA.php');
$rsa = new Crypt_RSA();
$keyary = $rsa->createKey(512);
$privatekey = $keyary["privatekey"];
$publickey = $keyary["publickey"];
$rsa->loadKey($publickey); // public key
$plaintext = 'Hello!';
//$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$ciphertext = base64_encode($rsa->encrypt($plaintext));
echo $ciphertext."\n\n";
$rsa->loadKey($privatekey); // private key
echo $rsa->decrypt(base64_decode($ciphertext));
echo "\n";
?>
出力は下記。
zIHLITqH3JOCWieC7BgHEBObDHDOQZm2f//OrqPxo3zDEbDNK2dlz/gpimiHlM0Ksa19uube2UDIOGog8YBb7Q==
Hello!
エンコードされたものは、バイナリーのようです。いったんテキストに変換しました。phpseclib には、ver. 1 と ver. 2 があるようです。上記の内容は ver. 1 での話です。
公開鍵,秘密鍵をたくさん作りました。
<?php
include('Crypt/RSA.php');
//Generates the pair keys
function generate_key_pair() {
global $public_key,$private_key;
$rsa = new Crypt_RSA();
//$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS1);
//$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
//define('CRYPT_RSA_EXPONENT', 65537);
//define('CRYPT_RSA_SMALLEST_PRIME', 64); // makes it so multi-prime RSA is used
$keyary = $rsa->createKey(); // == $rsa->createKey(1024) where 1024 is the key size
$private_key = $keyary["privatekey"];
$public_key = $keyary["publickey"];
}
$xmlstr = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n\n<root>\n\n";
$total = 100;
for ($i = 0; $i < $total; $i++) {
$xmlstr = $xmlstr."<key>\n<number>$i</number>\n<public>";
generate_key_pair();
$xmlstr = $xmlstr.$public_key."</public>\n<private>";
$xmlstr = $xmlstr.$private_key."</private>\n</key>\n\n";
}
$xmlstr = $xmlstr."</root>\n";
$key_file = fopen('key.txt','w');
fputs($key_file,$xmlstr);
fclose($key_file);
?>