カテゴリー別

お絵描き、デザイン

写真、動画関連ソフト

アメーバピグ専用ソフト

ホームページ関連

画像処理

スキャナー用

SEO 関連

お楽しみ

その他

過去ログ

2017年08月03日(木)

.NET RSACryptoServiceProvider と php の連携

今日は、Windows クライアントと php で
RSA の暗号、複合を行う方法について調査しました。

具体的には以下の 4 種類ができれば OK です。

Windows クライアントで暗号化 > php で復元
php で暗号化 > Windows クライアントで復元
Windows クライアントで署名 > php で検証
php で署名 > Windows クライアントで検証

このうち使用する予定なのは、
1 番目と 4 番目だったりしますが、
全部できることを確認しました。

Windows クライアントで .NET を使用する場合、RSA は、
RSACryptoServiceProvider (.NET 4.0) を使います。

.NET で作成したキーを php で読み込むコードは、
ココ にありました。ただし、RSA_XML.zip へのリンクは切れていたので
ページ内のコードをコピペして利用しました。

構文エラーをなくすには、 > < &
を >、<、& に変換する必要があります。

あと、先頭に、<?php も必要かな。

それで、一応動くようにはなりますが、
コメント覧にあるサンプルコードは間違いだらけですw。

単純な間違いとしては、
誤: include('Crypt/RSA.php');
正: include('Crypt/RSA_XML.php');

誤: $rsa->loadKey($XMLpublickey);
正: $rsa->loadKeyFromXML($XMLpublickey);
ですね。

重要な論理的な誤りとしては、
privatekey をロード encrypt した後
publickey をロード decrypt してますが、
encrypt に使用するのは、publickey で
decrypt に使用するのは、privatekey なのでおかしいです。

あとは、ライブラリーの仕様なのかもしれませんが、
privatekey をロードした状態で、Encrypt すると、
Decode に失敗するデーターが出力されます。

そんなこんなで正しいサンプルプログラムは
↓ のような感じになります。

$plaintext = 'terrafrost';

$rsa1 = new Crypt_RSA_XML();
$rsa1->loadKeyFromXML(xml_public_key());
$ciphertext = $rsa1->encrypt($plaintext);

$rsa2 = new Crypt_RSA_XML();
$rsa2->loadKeyFromXML(xml_private_key());
echo $rsa2->decrypt($ciphertext);

署名は ↓ のような感じになります。

$plaintext = 'terrafrost';
  
$rsa1 = new Crypt_RSA_XML();
$rsa1->loadKeyFromXML(xml_private_key());
$signature = $rsa1->sign($plaintext);
  
$rsa2 = new Crypt_RSA_XML();
$rsa2->loadKeyFromXML(xml_public_key());
echo $rsa2->verify($plaintext, $signature) ? 'verified' : 'unverified';

.NET 側の注意点

Crypt/RSA.php に、 define('CRYPT_RSA_ENCRYPTION_OAEP', 1);
という行があるからだと思いますが、
.NET で Decrypt、Encrypt するときには、
fOAEP 引数は true を指定する必要があるようです。

あと、署名のときには、
SignHash、VerifyHash ではなく、
SignData、VerifyData を使います。

Hash 系を使って連携する方法もあるかもしれませんが
今のところはよくわかりません。

・・・

.NET でできたので、Windows API でもできるはずだけど、
すんなりできるかなぁ?

ご意見・ご要望連絡窓口


コメント
コメントする