DOBON.NET DOBON.NETプログラミング掲示板過去ログ

RSA秘密鍵での暗号化

環境/言語:[Windows XP Pro SP2/VB.NET 2002]
分類:[.NET]

http://dobon.net/vb/dotnet/string/rsaencryption.html
ここのサンプルを使ってRSA方式での文字列の暗号化を行っています。

サンプルの目的通り、公開鍵で暗号化したものは秘密鍵で復号化できたのですが、
公開鍵暗号化方式のもう一つの特徴である「秘密鍵で暗号化したものは公開鍵でしか復号化できない」がうまくいきません。

Encryptでpublickeyに秘密鍵を指定して暗号化したものを
DecryptでprivateKeyに公開鍵を指定して復号化しようとすると、
「キーが正しくありません」というエラーが出てしまいます。
また、なぜか秘密鍵では復号化できてしまいます。

.NETが公開鍵暗号化方式の仕様に正しく法っていればできるはずだと思うのですが、
なぜできないのでしょうか。また、なぜ秘密鍵では復号化できてしまうのでしょうか。
どのようにしたらよいのでしょうか。ご教授宜しくお願い致します。
できないようになっているようです。詳しくは、次のリンク先をご覧ください。

http://groups.google.co.jp/group/microsoft.public.dotnet.security/msg/238cb8695f3c9560?hl=ja&
> できないようになっているようです。詳しくは、次のリンク先をご覧ください。
> http://groups.google.co.jp/group/microsoft.public.dotnet.security/msg/238cb8695f3c9560?hl=ja&

読んでみましたが、できないというようなことが書かれていますね・・・
試してはいませんが、おそらくDSAでもできないのでしょうね・・・

他の方法を考えます。ありがとうございました。
一応解決はしていないので、「解決済み」にはチェックしないでおきます。
質問の答えで無くて恐縮ですが
「出来ないと分かった」
のも解決ではあると思います
望ましい結果で無かったとしても
(要は「このスレ終了、もう見なくていいよ」ってサインだと思ってましたが…)
> 「出来ないと分かった」
> のも解決ではあると思います
> 望ましい結果で無かったとしても
> (要は「このスレ終了、もう見なくていいよ」ってサインだと思ってましたが…)

何か他の解決案、
例えば、「こうすればできるよ」とか「この方法で代用できませんか?」など、
直接的でなくても別の方法を提案してくださる方がいるかもしれないので、
このスレッドはまだ「見なくていいよ」という状態ではないと考え、
「解決済み」にはしませんでした。
「何をしても無理」というようでしたらあきらめて「解決済み」にしますが・・・

今自分で調べている範囲内だけでも、SignHashメソッドなどで代用できる可能性もありますし、
もちろんそれで自己解決した場合は、
何を代用してどのような方法で解決したのかを「解決済み」で書き込みます。
> 今自分で調べている範囲内だけでも、SignHashメソッドなどで代用できる可能性もありますし、
> もちろんそれで自己解決した場合は、
> 何を代用してどのような方法で解決したのかを「解決済み」で書き込みます。

SignHashメソッドについて日本語で扱っているサイトが1件も無かった(Googleでの検索結果)ので、
MSDNを読んだりサンプルプログラムを読み解いたりして結構大変でしたが、
(MSDNにはサンプルだけで秘密鍵の指定方法などの詳しい説明がない・・・)
いろいろ実験してどうにか解決できたので書き込みます。


文字列データを送信者側の秘密鍵で暗号化して送信後、
受信後に送信者側の公開鍵で復号化する方法です。

本来SignHashメソッドは送信者を証明する署名を作成するメソッドですが、
「署名」を「自由なデータ」に置き換えてしまえば、
結果自由なデータを秘密鍵で暗号化して送信することができることになります。
以下はそのやり方です。



送信者側

1.
 まず送信する文字列データを受信者側の公開鍵で暗号化します。
 やり方はこのサイトのTipsと同じです。

2.
 SignHashメソッドは元のデータがハッシュでないと使用できないので、1で作成したデータのハッシュを生成します。
 ハッシュ生成方法はこのサイトのTipsにあるので省略します。

3.
 2で作成したデータを元にSignHashメソッドで署名を作成します。
 秘密鍵の指定方法はこのサイトのTipsと同じで、署名を作成する前に先にCSPに入れてしまいます。
 SignHashメソッドで指定するハッシュアルゴリズムは2と同じものにします。

4.
 これで「署名」という形で「秘密鍵で暗号化」はできたので、この署名を送信します。
 受信者側で必要になるので、1で作成したデータも一緒に送信します。
 このデータは受信者側の公開鍵で暗号化されているので、送信しても安全です。


受信者側

1.
 受信した「1で作成したデータ」のハッシュを生成します。
 当然送信者が使用したものと同じアルゴリズムを使用します。

2.
 今1で作成したデータを元にVerifyHashメソッドで署名を検証します。
 送信者側の公開鍵の指定方法は送信者側の3と同じです。
 VerifyHashメソッドで指定するハッシュアルゴリズムも同じにします。
 署名が正しければVerifyHashの結果はTrueになります。

3.
 これで「署名の検証」という形で「公開鍵で復号化」はできました。
 あとは、送信者が2で受信者側の公開鍵でデータを暗号化しているので、
 1で受信した「1で作成したデータ」を受信者側の秘密鍵で復号化すれば元の送信データを得ることができます。



最初にも書いたとおりMSDN以外日本語でSignHashメソッドを扱っているサイトは無かったので、
ついでに少しでも同じ問題を抱えている人のお役に立てれば光栄です。
かなり省略した説明ですが、普段から暗号化に関して扱っている人なら上記説明だけで十分だと思います。

では、お騒がせしました。失礼します。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板