2011-01-28 15 views
0

ちょっとそこに、私は保存しているプロシージャを使用して保存して取得しているmsSQLデータベースです。私は配置される前にC#のWindowsフォームのいくつかのデータを暗号化しようとしているし、私はそれを元に戻すときにそれを解読します。すべての暗号化がC#側で処理されています。私はmicrosoft's tripleDESCryptoService Class(メモリのバージョン、2番目の例)から暗号化と解読のためのサンプルコードをそのまま使用しています。値は暗号化されてデータベースに送られますが、取得すると「不良データ」というエラーが発生します。 暗号化コールのサンプルです...c#tripleDESCrypto保存されたSQLから取得

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); 
byte[] tempByte = new byte[100]; 
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV); 
txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte); 

txt_Last_Nameは、データベースに送信され、私は、データベース内の何かがあることがわかります。 、「csDecrypt.Read(fromEncrypt、0:データベースで、最後の名前がで... varchar型(20)復号コールの

サンプルがあるの復号化機能で

TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider(); 
string lastName = dr.GetString(dr.GetOrdinal("Last Name")); 
if (isEncrypted) 
{ 
    byte[] toDecrypt = new ASCIIEncoding().GetBytes(lastName); 
    lastName = decrypt(toDecrypt, tDESalg.Key, tDESalg.IV);      
} 
txt_Last_Name.Text = lastName; 

それ爆弾ですfromEncrypt.Length); "なぜ私は理解していません。私はそれがデータベースに正しく格納されていないか、私の変換が正しくないかどうかはわかりません。

解読関数に入る「データ」はサイズ16でゼロ以外の値を含みますが、「byte [] fromEncrypt」はすべてのゼロを含むサイズ16の配列です。

ありがとうございました!

+1

tempByteをUnicode文字列として処理することはできません。文字列ではありません。 – pascal

+0

TripleDESは弱いとみなされます。代わりにAESの使用を検討する必要があります:)。 – ykatchou

答えて

3

編集:さて、ASCIIの問題はあまりにも痛いかもしれませんが、さておきました。

新しいTripleDESCryptoServiceProviderを作成し、キー/ IVを要求するたびに、新しいものが生成されます。データを解読するためには、どこかに安全に保管する必要があります。あなたはtempByteに任意のバイナリデータを持っている

txt_Last_Name.Text = System.Text.ASCIIEncoding.ASCII.GetString(tempByte); 

:それは本当に暗号化ではありませんので、そうしないとあなたは...


を任意の「秘密」を持っていないこれはひどいアイデアです。 は有効なASCIIテキストであると仮定しないでください。それはほぼ確実にデータを失う場所です。

不透明なバイナリデータをテキストとして安全にエンコードするには、Convert.ToBase64StringConvert.FromBase64Stringを使用します。

また、これは悪い考えです:

byte[] tempByte = new byte[100]; 
tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV); 

あなたはそれを無視するつもりなら、バイト配列を作成するためのポイントは何ですか?代わりに

byte[] tempByte = encrypt(txt_Last_Name.Text, tDESalg.Key, tDESalg.IV); 

を使用してください。ああ、.NETの命名規則に従うようにしてください:)

あなたの暗号化が常に16の0のバイト配列を返す場合、これはあなたのencryptメソッドが壊れていることを示すかなりの兆候です。あなたがそのメソッドのコードを投稿するまで、私たちは本当に助けてくれません。

最後に、あなたのカラムがタイプvarchar(20)である場合、それはあなたが必要とするすべてのデータを保持していない可能性があることに注意する必要があります...特にあなたが塩を入れるならば。 Base64はデータのサイズを幾分増やし、暗号化もそうするでしょう。別の答えで述べたように、これをバイナリとしてとしてデータベースに格納することは、多くの点でより賢明です。

は(注意:あなたはは、そのコードを使用したいなかった場合でも、私はtxt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);としてそれを書きたいディレクティブを使用してあなたの友人であり、ASCIIEncodingの財産である、ないASCIIEncoding。)

+0

byte []の文字への変換のこの記事では、ASCIIエンコーディングの使用に基づく間違った解決策の数が驚くほどです... – pascal

+0

@pascal:* any *通常のエンコーディングの使用は問題です...しかし通常はASCIIまたはUTF-8です。 –

+0

私は、リンクを介して暗号化メソッドを提供しました。これは、MicrosoftのtripleDES ... msdnのプロバイダクラスページにあります。 tempByteは概念証明のためだけのものでした。私はそれを変更し、バイト配列の作成を取り除き、それを無視して、convert.toとbase64を使用しています。それでも失敗します。私はバイナリタイプをSQLで試さなければならないと思っています... –

0

だけreading the doc ... Convert.ToBase64String()を使用してバイト[]を文字列に変換する必要があります。

+0

...そしてJon Skeetが32秒で私を打ち負かすと、それに対応する:Convert.FromBase64String'が返されます。 – pascal

+0

うん、変換のその方法を試して、まだ動作しません...しかし、感謝! –

0

上記の推奨されているパスカルのようにConvert.ToBase64String()を使用するか、テキストではなくデータベースにバイナリとしてデータを格納します(これは、スペースが少なくて済みます)。 SQL Serverには、この目的のためにVARBINARY(MAX)データ型があります。

+0

申し訳ありませんが、Jonの回答は既にバイナリとして保存することを示唆していませんでした。 –

関連する問題