2011-01-31 16 views
0

ここで私が解決しようとしている問題があります。 ASP.NET MVCで構築されたいくつかのWebソフトウェアをリリースしていたとし、エンドユーザーがXユーザーをシステムに追加できるようにしたいとしましょう。ソフトウェアは自社のサーバーでホストされます。C#RSA暗号化プライベート復号化公開?

ユーザーが新しいユーザーを追加しようとすると、そのユーザーは暗号化された文字列をファイルから読み込みます。ウェブサイトがそれを解読すると、クリアテキストが許可されたユーザーの数になります。

私の最後にこの文字列を生成するために暗号化するために、私の最後にはどのように最善の/最も単純な方法ですか?明らかに、私は、エンドユーザーが自分の暗号化された文字列を回転させず、私の代わりにできることを保証したいと思います。私はストリングを解読する方法がわからないように、私のソースを難読化しようとすることを心配したくありません。

プライベートRSA鍵で暗号化して公開鍵で復号化することはできますか?私は、下のコードでそれを運んでいませんでした:

 var rsa = new RSACryptoServiceProvider(); 

     var pubicKey = rsa.ToXmlString(false); 
     var privateKey = rsa.ToXmlString(true); 

     var test = "this string needs to be encrypted then decrypted"; 

     var rsa2 = new RSACryptoServiceProvider(); 
     rsa2.FromXmlString(privateKey); 

     var encryptedBytes = rsa2.Encrypt(Encoding.UTF8.GetBytes(test), false); 
     var encryptedString = Convert.ToBase64String(encryptedBytes); 

     var rsa3 = new RSACryptoServiceProvider(); 
     rsa3.FromXmlString(pubicKey); 

     encryptedBytes = Convert.FromBase64String(encryptedString); 

     var decryptedString = Encoding.UTF8.GetString(rsa3.Decrypt(encryptedBytes,      false));  
+0

ソフトウェアは、サーバー上で実行されています。ライセンスファイルがどのようにデコードされているかを判断するために "彼ら"があなたのソースを覗いていると判断された場合、デコード機能を変更して必要なものを返すのは簡単ではありません。 –

+0

右...私が以下で言ったように。秘密鍵で何かを暗号化することはできません。暗号化された文字列を兄弟の公開鍵で復号化できるだけですか?公開鍵はサーバ上に存在し、秘密鍵にアクセスすることはありません。 – aherrick

+0

鍵がどこにホストされているか教えてください。私はあなたが公開鍵があなたのクライアントでホストされ、秘密鍵があなたのホストであることを意味しますか? –

答えて

3

をあなたは、秘密鍵は、あなたのメッセージが本物であることを確認し、署名を生成するために使用された署名の戦略を、使用することができます。

// Create message and signature on your end 
string message = "Here is the license message"; 

var converter = new ASCIIEncoding(); 
byte[] plainText = converter.GetBytes(secret); 

var rsaWrite = new RSACryptoServiceProvider(); 
var privateParams = rsaWrite.ExportParameters(true); 

// Generate the public key/these can be sent to the user. 
var publicParams = rsaWrite.ExportParameters(false); 

byte[] signature = 
    rsaWrite.SignData(plainText, new SHA1CryptoServiceProvider()); 

// Verify from the user's side. Note that only the public parameters 
// are needed. 
var rsaRead = new RSACryptoServiceProvider(); 
rsaRead.ImportParameters(publicParams); 
if (rsaRead.VerifyData(plainText, 
         new SHA1CryptoServiceProvider(), 
         signature)) 
{ 
    Console.WriteLine("Verified!"); 
} 
else 
{ 
    Console.WriteLine("NOT verified!"); 
} 

この例では、主にMicrosoft社のサイトからコピーされました:

そして、ここでのコンセプトを説明したウェブページは次のとおりです。

0

あなたの考えは正しいですが、予期せぬ結果については疑問に思っています。

あなたは自分のサーバ上でソフトウェアを実行していると言います。つまり、彼ら自身がサービスをホストしているということです。しかし、あなたはまた、このサービスはあなたのサーバーで検証してユーザーを追加するためにインターネットに接続しなければならないと言います。インターネットがダウンしたとき、またはセキュリティ保護されたシステムを持ちたいときにファイアウォールがサーバーへのインターネットアクセスをブロックするとどうなりますか?彼らは機能する能力を完全に失うだろうか?

ちょうどあなた自身を尋ねる質問を与える:P

+0

彼が現在のモデルを保持しているなら、ある期間は動作するキャッシュを用意して、インターネットサービスを復元する必要があります。 –

+0

いいえWebサービスやその影響を検証するためにサーバーに「手を差し伸べる」ことはできません。私が思ったのは、指定されたインストールのために私が固有の公開鍵/秘密鍵を生成した場合、そのデータを秘密鍵で暗号化すれば、その兄弟公開鍵だけがその文字列を復号化できることです。これは当てはまりませんか? – aherrick

2

あなたが探しているのはデジタル署名だと思います。コンテンツが暗号化されているかどうかは関係ありません。なぜなら、ユーザーはそれを解読するための(公開)キーを持っているからです。重要なことは、コンテンツのソースがあなたのものである場合のみです。 設定ファイルがあるので、それはXMLだと思うので、XMLDSIGを探しています。

.NETでSignedXmlクラスを使用すると簡単にこれを達成できます。次に、設定ファイルを読み込むときに署名を確認するだけです。この方法では、X509証明書をeaislyで使用することができます。署名付きファイルに公開鍵を埋め込むこともできます。そのため、ユーザーは証明書(公開鍵)をインストールする必要はありません。

0

公開鍵を使用してファイルを復号化することはありません。秘密鍵でファイルを復号化することしかできません。

秘密鍵で作成したデータの署名だけでなく、ユーザー数も保存できます。クライアントで

切断、あなたが署名を検証するために、あなたの公開鍵を使用すると、ファイル内のデータと一致する(ユーザー数)

しかし、高度なユーザーが自分で自分の公開鍵を入れ替える可能性があります自分自身を所有し、ファイル自体に署名します。

+0

あなたが言うように、これは本当に暗号化するだけでは安全ですか?誰かが自分の公開鍵と署名を作成するのを妨げるものは何もありません。誰かがこれをやってしまうのを防ぐ馬鹿な方法はありませんか? – aherrick

+0

データの復号化と署名データが異なります。私の主張は、公開鍵でメッセージを復号化することができないということでした。(秘密のrsa鍵で暗号化し、公開鍵で復号化することは可能ですか?)署名からプレーンテキストメッセージを抽出することはできません。署名はプレーンテキストメッセージと信頼できる公開鍵とともに秘密鍵の所有者からマッサージが行われたことを確認します。 –

+0

スティーブン。私は混乱を避けるためにコメントを削除しました。 –

0

質問のあなたのコメントに記載されているように、あなたのアプローチは、クライアントのキーと自分のキーを使用しています。 RSAで使用される素数は、対応する秘密/公開鍵だけで使用されるため、これは機能しません。

2つのキーを使用する必要があり、クライアントまたはクライアントの2つのキーではなく、あなたのものは使用しないでください。例えば、

  1. あなたはそれはあなたの秘密鍵で暗号化し、クライアントが自分の公開鍵を使って復号化できるようにすることで、あなたの2つのキーを使用してに署名することができます。
  2. クライアントの公開鍵を使用して暗号化し、復号化するには(クライアントの)秘密鍵を使用することができます。

希望します。

+0

Greg - おかげさまで...私は、公開鍵を使用した暗号化と復号化の両方がオプションではないと考えています。そうであれば、サーバ上にある公開鍵を使って文字列を暗号化するプログラムを書くだけでよいのです。その後、暗号化された文字列を置き換えてください。私はその考えに間違っていますか? – aherrick

+0

私は言葉が正確ではないと思う、思考が正しいことを買う。自分の鍵を使った暗号化と復号化はオプションではないと思ったのでしょうか?彼らはちょうど自由にそれを変えることができると思うのは正しい。私は2つのアプローチについて説明していました。 –

+0

最初のオプションを使用して、公開鍵を使用してクライアントの復号化(署名の検証)を行い、秘密鍵を使用してデータを作成して署名できるようにします。 –

関連する問題