0

パスワード付きのSQLサーバーデータベースを受け取りました。このデータベースは、.NETWebサイトからのものです。WebサイトをPHPに再構築しているので、パスワードに独自の暗号化アルゴリズムを使用したいと思います。そのために、ソースデータベースからパスワードを復号化しようとしましたが、今のところ成功していません。

元の開発者によると、Rijndael暗号化を使用しています。キーはデータベースのblobフィールドとして使用されていました。それらをエクスポートし、PHPを使用してパスワードを復号化しようとしました。私は成功していませんが、スタックオーバーフローのどこかで、PHPと.NETの実装方法に違いがあることを読みました。これは、.NETでの暗号化の方法を変更することによってのみ修正できますが、それはオプションではありません。

そこで次に試したのは、パスワードをデコードするための小さな.NETWebフォームを作成することです。テストには、次のコードを使用します。

var iv = Encoding.UTF8.GetBytes("5F38D2742EFC59486F6CBDDAB3E46EC5");
var key = Encoding.UTF8.GetBytes("F88640BE83A6911472BA4AF9B9C37E2C2B3E78BCFECF4BC6ADE1E928441F6AD7");

var rijndael = new RijndaelManaged
{
    BlockSize = 256,
    IV = iv,
    KeySize = 256,
    Key = key
};
rijndael.Padding = PaddingMode.None;
var buffer = Convert.FromBase64String("D1jo49HH6cL4kZVVeIDyDbJGtO4+f2N9YIonOqRg6hM=");
var transform = rijndael.CreateDecryptor();
string decrypted;
using (var ms = new MemoryStream())
{
    using (var cs = new CryptoStream(ms, transform, CryptoStreamMode.Write))
    {
        cs.Write(buffer, 0, buffer.Length);
        cs.FlushFinalBlock();
        decrypted = Encoding.UTF8.GetString(ms.ToArray());
        cs.Close();
    }
    ms.Close();
}
Label1.Text = decrypted;

ちなみにキーを変更しましたが、文字数は同じです。明らかに、キーのサイズは256ビットではなく512ビットです。しかし、それはRijndaelではサポートされていません。キーの半分を取り除いてもエラーは発生しませんが、もちろん正しいパスワードを教えてくれません。

キーが16進文字であることに気づきました。http://www.string-functions.com/hex-string.aspxなどのWebツールを使用して変換しようとしましたが、有効な文字列が得られません(奇妙な文字がいくつかあります。したがって、これはそれと関係がありますが、もしそうなら、それをどのように変換するのですか?

4

1 に答える 1

1

エラーは次の 2 行にあります。

var iv = Encoding.UTF8.GetBytes("5F38D2742EFC59486F6CBDDAB3E46EC5");
var key = Encoding.UTF8.GetBytes("F88640BE83A6911472BA4AF9B9C37E2C2B3E78BCFECF4BC6ADE1E928441F6AD7");

文字列リテラルにあるものは、16 進文字列のようです。これらは、文字の各ペアを順番に取り、それらを に変換することによってデコードする必要がありbyteます。残念ながら、これを行うための組み込み関数は .NET フレームワークにはありませんが、C# でバイト配列を 16 進数文字列に、またはその逆に変換する方法に関する質問には、これを達成するための役立つヒントが含まれているはずです。

代わりに、現在のコードは各文字を順番に取り、byteその文字の UTF8 値である 1 つ以上 (この場合は常に 1 つ) の値を計算します。

これらは 2 つの非常に異なる操作ですが、文字がどのように消費されるか、または消費されるべきかの違いは、受け取ると予想していたものと比較して 2 倍のバイト数を取得する理由です。

于 2012-08-24T06:24:09.057 に答える