0

そうですね、msSQLデータベースでは、ストアドプロシージャを使用して保存および取得しています。配置する前にc#Windowsフォームで一部のデータを暗号化しようとしていますが、もちろん、データをプルバックするときに復号化しています。すべての暗号化はC#側で処理されています。マイクロソフトのtripleDESCryptoServiceクラス(メモリバージョン、2番目の例)の暗号化と復号化のサンプルコードをそのまま使用しています。値は暗号化されてデータベースに送信されますが、値を取得すると「不正なデータ」エラーが発生します。暗号化呼び出しのサンプルは...

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がデータベースに送信され、データベースに何かがあることがわかります。データベースでは、名前は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;

「csDecrypt.Read(fromEncrypt、0、fromEncrypt.Length);」で復号化関数を爆撃します。理由がわかりません。データベースに正しく保存されていないのか、変換が正しくないのかわかりません。

それが何かを意味する場合、復号化関数に入る「データ」はサイズ16であり、ゼロ以外の値を含みますが、「byte[]fromEncrypt」はすべてゼロを含むサイズ16の配列です。

助けてくれてありがとう!

4

3 に答える 3

3

編集:さて、私たちはそれの底に到達しました...ASCIIの問題も噛まれたでしょうが。

新しいキー/IVを作成して要求するたびに、新しいTripleDESCryptoServiceProviderキー/IVが生成されます。データを復号化する必要があるため、これをどこかに安全に保存する必要があります。そうでなければ、あなたは「秘密」を持っていないので、それは実際には暗号化ではありません...


これはひどい考えです:

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

に任意のバイナリデータがありtempByteます。有効なASCIIテキストだと思い込まないでください。それはほぼ確実にあなたがデータを失っているところです。

Convert.ToBase64Stringおよびを使用して、Convert.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個のゼロのバイト配列を返す場合、それはencryptメソッドが壊れていることのかなり確実な兆候です。あなたがそのメソッドのコードを投稿するまで、私たちはそこで本当に助けることはできません。

最後に、列がタイプのvarchar(20)場合、必要なすべてのデータを保持できない可能性があることに注意する必要があります...特にソルトを含める場合はそうです。Base64はデータのサイズをいくらか大きくし、暗号化もそうする可能性があります。別の回答で述べたように、これをバイナリとしてデータベースに保存することは、多くの点でより賢明です。

(注:そのコードを使用したい場合でも、私はそれを次のように記述しtxt_Last_Name.Text = Encoding.ASCII.GetString(tempByte);ます。ディレクティブの使用はあなたの友達でありASCII、のプロパティでありEncoding、ではありませんASCIIEncoding。)

于 2011-01-28T17:15:54.403 に答える
0

ドキュメントを読むだけで...byte[]を。を使用して文字列に変換する必要がありますConvert.ToBase64String()

于 2011-01-28T17:16:26.297 に答える
0

上記で推奨されているpascalのようにConvert.ToBase64String()を使用するか、データをテキストではなくバイナリとしてデータベースに保存します(使用するスペースが少なくなるため、推奨されるソリューションです)。SQL Serverには、まさにこの目的のためのVARBINARY(MAX)データ型があります。

于 2011-01-28T17:18:57.733 に答える