1

ファイルにいくつかのパスワードを保存する必要がある C# プロジェクトに取り組んでいます。それらをsha1で暗号化したい。私はすでに C プロジェクトで sha1 prog の暗号化/復号化を行っています。私のC#プロジェクトからパスワードextern "C" __declspec(dllexport) char * Password_SHA1_Build(char *Password))を暗号化するC関数である「password_sha1_build」を呼び出したいです。

「Password_SHA1_Build」関数があるファイルからdllを構築し、次のようにC#プロジェクトから呼び出すようにしました:

[DllImport("Pass.dll")]
public static extern string Password_SHA1_Build(string Password);

... 

string password = "iamlee";
string hashedpwd = "";
hashedpwd = Password_SHA1_Build(password);

そして、Pinvoke が署名と一致しないというエラー (フランス語) が表示されます... アンバランスです。string / char * を使用していることが原因ではないかと思いましたが、その場合は対処できますか?.

必要に応じてさらに情報を求めてください。ありがとうございました


こんにちは、すべての回答に感謝します。

私は自分の主題が十分にはっきりしていないことに気づきました。C# プログラムに書き込まれた暗号化されたパスワードが格納されている infos.cfg という名前のファイルを読み取る「サーバー」として使用される C プログラムがあります。この C プログラムは自分で開発したものではありませんが、関数 "char * Password_SHA1_Build(char *Password)" によって作成された sha1 パスワードを読み取ることができる "int Password_SHA1_Check(char *Password, char *Hash)" という名前の関数が含まれています。 .

最初は、次のように c# で sha1 を使用してパスワードを保存しようとしました。

System.Security.Cryptography.SHA1 hash = System.Security.Cryptography.SHA1.Create();
System.Text.ASCIIEncoding encoder = newS ystem.Text.ASCIIEncoding();
byte[] combined = encoder.GetBytes(password);
hash.ComputeHash(combined);
//rethash = Convert.ToBase64String(hash.Hash);
System.Security.Cryptography.SHA1CryptoServiceProvider sha1 = new System.Security.Cryptography.SHA1CryptoServiceProvider();
byte[] hash = sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(password));
string delimitedHexHash = BitConverter.ToString(hash);
string hexHash = delimitedHexHash.Replace("-", "");
rethash = hexHash;

パスワードは次のようにファイルに保存されます。はソルトで、後はハッシュです

しかし、C プログラムが Password_SHA1_Check を実行すると、入力したパスワードが保存されているパスワードと同じではないことがわかります。私は暗号が苦手で、他の作業で忙しいので、「既に存在して機能する「Password_SHA1_Build」関数を使用しないのはなぜですか」と自問したので、C#プログラムからこの関数を呼び出そうとしました。これが明確であることを願っています。申し訳ありませんが、私の英語はかなり下手です。

Reed Copsey へ : ありがとうございます

4

2 に答える 2

2

これは、呼び出し規約の不一致が原因である可能性があります。PInvoke はStdCallデフォルトで使用しますが、VC コンパイラはCDeclデフォルトで使用します。

次のように変更してみてください:

[DllImport("Pass.dll", CallingConvention=CallingConvention.Cdecl)]

その他の潜在的な問題は、文字列のマーシャリング手法です。使用するエンコーディングを指定するかStringBuilder、2 番目のパラメータとして渡し、それを使用して結果を「埋める」必要がある場合があります。

于 2013-03-27T17:01:17.570 に答える
0

.Net フレームワークには、SHA256 を含む多くの暗号化アルゴリズムが組み込まれています。SHA256Managedクラスを使用してみてください。また、最終的にパスワードを解読したい場合は、対称暗号化機能が必要ですが、SHA はその機能の 1 つではありません。

この投稿をご覧ください:パスワードの取得と保存

于 2013-03-27T17:02:49.033 に答える