2011-12-28 15 views
0

SQL Serverに格納されて生成された非対称キーを使用してクライアントで暗号化を実行したいとします。SQL Serverの公開鍵を使用した.NetでのRSA暗号化?

私は、次のクエリを使用してDMVから公開鍵を取得することができます。

0x06020000002400005253413100020000010001008B656455D4C56392C45EEC3563203635F5F42DDA57069E7A880BF0AF055174A2A165DED75BA4E73E2A09BCBFAA50042B4E27354C1FEB3361F81C381AFF59A6A7

どのように私は、このバイナリを使用することができます。

SELECT public_key FROM sys.asymmetric_keys WHERE name = 'KeyName' 

これには次の値を返します。ヴァル.NetのRSA_512暗号化の公開鍵としてのue?私はここでsimilar questionsを検索しましたが、適切な解決策を見つけることができませんでした。私はXML形式の鍵が必要です。あるいは公開鍵の.Modulus.Exponentを知る必要があります。これらのバイナリシーケンスから取得できますか?


EDIT

ここでは、私は最後の行で例外 "キー有効ではありません" を取得する私のコード

SqlCommand cmd = new SqlCommand(string.Format("SELECT dbo.GetKey(@KeyName)", conn); 
    cmd.Parameters.AddWithValue("@KeyName", ConfigurationManager.AppSettings.Get("PublicKeyName")); 
    PublicKey = (byte[]) cmd.ExecuteScalar(); 

    var rsa=new System.Security.Cryptography.RSACryptoServiceProvider(Convert.ToInt32(ConfigurationManager.AppSettings.Get("KeyLength"))); 
    rsa.ImportCspBlob(PublicKey); 
    EncryptedData = rsa.Encrypt(Data,false); 

です。

答えて

1

keyblobは上記のキーの[]表現です。

これは私のシェルから直接来る:

[email protected]:~$ csharp 
Mono C# Shell, type "help;" for help 

Enter statements below. 
csharp> using System.Security.Cryptography;                                       
csharp> String keystring="06020000002400005253413100020000010001008B656455D4C56392C45EEC3563203635F5F42DDA57069E7A880BF0AF055174A2A165DED75BA4E73E2A09BCBFAA50042B4E27354C1FEB3361F81C381AFF59A6A7"; 
csharp> byte[] keybytes=new byte[keystring.Length/2]; 
csharp> for (int i=0;i<keystring.Length/2;i++) keybytes[i]=Convert.ToByte(keystring.Substring(2*i,2),16); 
csharp> RSACryptoServiceProvider rsa=new RSACryptoServiceProvider(512); 
csharp> rsa.ImportCspBlob(keybytes); 
csharp> byte[] cleartext=new byte[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; 
csharp> byte[] ciphertext=rsa.Encrypt(cleartext,false); 
csharp> ciphertext; 
{ 62, 80, 66, 63, 4, 132, 69, 249, 97, 164, 131, 34, 89, 117, 173, 177, 222, 77, 23, 177, 127, 236, 116, 121, 25, 63, 59, 159, 182, 235, 190, 44, 24, 101, 127, 61, 185, 72, 93, 69, 66, 248, 64, 249, 5, 183, 214, 189, 252, 75, 22, 123, 159, 50, 13, 90, 137, 187, 180, 181, 252, 174, 98, 247 } 
csharp> keybytes; 
{ 6, 2, 0, 0, 0, 36, 0, 0, 82, 83, 65, 49, 0, 2, 0, 0, 1, 0, 1, 0, 139, 101, 100, 85, 212, 197, 99, 146, 196, 94, 236, 53, 99, 32, 54, 53, 245, 244, 45, 218, 87, 6, 158, 122, 136, 11, 240, 175, 5, 81, 116, 162, 161, 101, 222, 215, 91, 164, 231, 62, 42, 9, 188, 191, 170, 80, 4, 43, 78, 39, 53, 76, 31, 235, 51, 97, 248, 28, 56, 26, 255, 89, 166, 167 } 
csharp> 
+0

これは動作しません。 'ImportCspBlob()'は警告を出しませんが、 'rsa'オブジェクトから' Encrypt() 'メソッドを使用しようとする限り、私は"無効なキー "例外を受け取ります。興味深いことに、キーのサイズの合計はわずか84バイトです - それは正しいですか? –

+0

あなたの質問の価値と私のために働く...これは本当の価値ですか? –

+0

84バイトが672ビット、OKと見える –

関連する問題