パスワード付きの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ツールを使用して変換しようとしましたが、有効な文字列が得られません(奇妙な文字がいくつかあります。したがって、これはそれと関係がありますが、もしそうなら、それをどのように変換するのですか?