暗号化パッケージの変更

13 9月

これまで使っていた 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/ の中です。関連して,他のパッケージも入りました。
phpseclib_folder
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);
 
?>