アセンブリ PublicKey を使用して、対応する PrivateKey で暗号化された文字列を復号化できますか?

StackOverflow https://stackoverflow.com/questions/1847357

質問

.NET でアセンブリに署名するには、公開キーと秘密キーのペアが必要です。私が読んだ限りでは、.NET は RSA アルゴリズムと秘密キーを使用してアセンブリに署名し、埋め込まれた公開キーでチェックします。

公開キーを取得する方法は知っています (Assembly.PublicKey)。私は、そのキーを使用して、秘密キーで暗号化されたデータを含む短い文字列を復号できるかどうか疑問に思いました。

私がこれまでに読んだドキュメント (例えば) は、その逆のみが可能であることを暗示しているようです。暗号化には公開キーを使用し、復号化には秘密キーを使用する必要がありますが、それをアセンブリに含めたくありません。

文字列に署名するだけなら大丈夫だと思います。しかし、どうやって?

どうやって始めたらいいのか少し迷っています。誰かコードスニペットを持っていますか?

また、小さな文字列の暗号化/署名は PHP で行うのが理想的です。これを Web サーバーにオフロードしたいのですが、これまでのところ、汎用の PHP/MySQL でホストされる Web サイトしかないからです。

使用事例:私は、ベータ テスターに​​リリースしようとしているソフトウェア用の軽量ライセンス スキームを考え出そうとしています。ソフトウェアはおそらくフリーウェアなので、私たちが本当に達成したいのは次のとおりです。

  1. 誰がソフトウェアをインストールしたかを知る (電子メールアドレス)
  2. 一定の期間が経過するとソフトウェアの有効期限が切れます。その後、ユーザーは新しいライセンスを取得する必要があります。
    • これはフォームに記入し、キーが記載された自動メールが届くのを待つだけで簡単です。
    • 私たちは、古いバージョンが戻ってきて評判を傷つけたり、悩まされたりする可能性を減らそうと努めています。

タプル (有効期限、フィンガープリント) を暗号化し、起動時にそれを復号化できると、ライセンス モジュールが簡単になります。アプリケーションを初めて起動するとき、ユーザーは電子メール アドレス、名前、組織の入力を求められます。この情報は、一部のシステム情報 (NIC、コンピュータ名、アセンブリのメジャー バージョンとマイナー バージョン) の md5 フィンガープリントとともに Web サーバーに投稿されます。Web サーバーは、暗号化されたバージョンのタプル (有効期限、フィンガープリント) を電子メールで応答し (電子メール アドレスの有効性をチェックし)、その後ディスクに保存します。起動時に、これを復号化し、現在の日付および再生成されたフィンガープリントと比較できます。

編集:はい、私の質問に対するすべての答えはまだありません。しかし、.NET では暗号化に秘密キーを簡単に使用できるわけではないようです (それが可能であるとしても、その点については回答があまり一致していません)。

私が取るルートは次のとおりです (私のユースケースに基づく):

  • 秘密キーを使用してライセンスに署名します。
  • 公開キーを使用して、ライセンスが秘密キーで署名されたことを確認します
  • .NET キーの使用方法について、PHP 開発者を対象とした別の質問を投稿します (作成者: sn.exe) テキストに署名する
  • とにかくライセンスはハッシュであり、ユーザーがすでに知っているものから計算されるため、ユーザーがライセンスを見ることについてはあまり心配していません。私が望んでいるのは、一般的な建築設計者が私のソフトウェアを私の知らないうちにコピーする手間がかからないようにすることだけです (ソフトウェアはフリーウェアであることを忘れないでください。私が欲しいのは、誰がそれをインストールしたかを紙に記録することだけです... )

ご回答いただき誠にありがとうございました。

役に立ちましたか?

解決

.NET にはありません。

RSA などの従来の公開キー暗号化アルゴリズムの多くでは、両方の方法で暗号化と復号化を行うことができます。通常、一方の方法は「暗号化」と呼ばれ、もう一方の方法は「署名」と呼ばれますが、実際には両方の方法で暗号化されたバージョンが得られます。

ただし、.NET では RSA 実装が機能不全に陥り、署名時に完全に処理された情報ではなく、入力のダイジェストのみが生成されます。

RSA で何ができるのか、何ができないのかについては意見の相違があるようですので、より具体的にするために私の回答を編集させてください。

ここで話しているのは RSA の計算についてであり、特定の RSA 実装ではありません。

RSA 数学では、2 つのキー (秘密キーまたは公開キー) のいずれかで情報をエンコードできますが、エンコードされたデータは 2 つのキーのうちもう一方のキーでのみデコードできます。

通常、公開キーを使用してエンコードして情報を暗号化し、秘密キーを使用してデコードして情報を復号します。または、情報のハッシュを取得し、それを秘密キーでエンコードし、ハッシュに署名し、公開キーでハッシュをデコードして、署名を比較および検証します。

一般的な実装では、データをハッシュすることによってのみ、プライベートからパブリックへのデータの完全なエンコードを行うことはできませんが、 RSA の背後にある計算により、これが完全に可能になります.

他のヒント

公開キーを使用して復号化することはできません。そうなると「公共」という意味がまったくなくなってしまいます。

(ただし、秘密キーを使用して何かに署名し、公開キーを使用して署名を検証することはできる場合があります。これが、フレームワークがキーを使用する目的です。アセンブリは署名され、公開キーは署名を検証するために使用されます。)

これは、SignedXml を使用して実行できます。 http://msdn.microsoft.com/en-us/library/ms229745.aspx. 。下位レベルでは、RSAPKCS1SignatureDeformatter と RSAPKCS1SignatureFormatter を使用することができます。これらは、データのハッシュを暗号化し、そのデータを相手側の (復号化された) ハッシュと比較することによって機能します。秘密鍵暗号化では小さいデータしか扱えないため、ハッシュが使用されていると思います。アセンブリ公開キーを再利用するかどうかはわかりません。問題が発生する場合は、別のキー ペアを使用してください。

これらのクラスでは 20 秒間のハングアップが発生する可能性があるため、注意してください。 http://www.pcreview.co.uk/forums/thread-3428177.php

このアプローチは、Reflexil を使用して改ざんされる署名検証コードに対して脆弱ですが、それは別の問題です。

以下のように書きましたが、もう一度読んでみると、すでに理解されていると思います。実際にユーザーのデータを暗号化したり隠したりしようとしているのではなく、ユーザーがライセンスを作成したり改ざんしたりするのを阻止したいのです。これには公開秘密キー暗号化アルゴリズムを使用できるということは正しいです。これはとして知られています 署名 秘密キーを使用します (サーバー側のライセンス生成)。そして公開鍵を使った署名の検証(アプリ内でのライセンスチェック)。研究に役立つため、この用語について言及します。

RSA では、暗号化には公開キーが使用され、復号化には秘密キーが使用されます。公開キーを使用して何かを復号化することはできません...

RSA では、公開キーと秘密キーの唯一の実際の違いは、どちらを秘密にするかということです。

したがって、公開キーを暗号化キーとして使用し、秘密キーで復号化することも、秘密キーを暗号化キーとして使用し、公開キーで復号化することもできます。

デジタル署名には秘密鍵による暗号化が使用されます(公開鍵を使用すれば誰でも復号化できます)。

しかし@Lasse Vとして。Karlsen 氏は、.Net によってそれが必要以上に難しくなる可能性があると指摘しました...

パブリックで暗号化し、プライベートで復号化し、秘密キーで暗号化するのは両方の方向が可能だと思います。2 つ目は、デジタル署名の仕組みです。

警告!この答えは間違っていますが、添付されている一連のコメントは、他の人にとっても答えを残しておくのに十分な関心があると思うため、それでもここに残しておきます。OK、それは私がばかのように見えるかもしれませんが、それは私にとって新しいことではありません ;) 好きなように投票してください。

公開キーは次の目的で使用できます:-

  • 秘密鍵でのみ復号化できるものを暗号化する
  • 秘密鍵で署名されたものを認証する

秘密鍵で暗号化されたものを復号化するために使用することはできません。このため、公開/秘密キー システムは非対称システムと呼ばれます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top