1

我正在开发一个 C# 项目,我必须在文件中存储一些密码。我想用sha1加密那些。我已经在 C 项目中加密/解密 sha1 prog。我想从我的 C# 项目中调用“password_sha1_build”,它是加密密码 extern "C" __declspec(dllexport) char * Password_SHA1_Build(char *Password)) 的 C 函数。

我从有“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 与签名不匹配的错误(法语)......不平衡。我坚持认为问题可能来自我使用字符串/字符 * 的事实,但如果是这种情况,我可以处理吗?

如果需要,请询问更多信息 谢谢大家


嗨,感谢大家的回答。

我注意到我的主题不够清楚。有一个用作“服务器”的 C 程序,它将读取名为 infos.cfg 的文件,其中存储了在 C# 程序中写入的加密密码。C程序不是我自己开发的,但它包含一个名为“int Password_SHA1_Check(char *Password, char *Hash)”的函数,它能够读取由函数“char * Password_SHA1_Build(char *Password)”构建的sha1密码.

因此,起初我尝试使用 sha1 将密码存储在 c# 中,如下所示:

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;

密码像这样存储在文件中:“。”之前的“密码:sha1:576295.49880ab837e9179dd68dfb142342f368e821de43”。是盐,之后是哈希

但是当 C 程序执行他的 Password_SHA1_Check 时,他告诉我我输入的密码与存储的密码不同。我在加密方面有点弱,并且忙于其他工作,所以我只是问自己“为什么不使用已经存在并且有效的“Password_SHA1_Build”函数”所以这就是为什么我试图从我的 C# 程序中调用这个函数。我希望这很清楚,对不起,我的英语很糟糕。

致 Reed Copsey:谢谢我试过了,至少 Pinvoke 异常消失了,但现在我得到了一个“AccessViolationException”。所以任何更多的想法都会受到欢迎,再次感谢!

4

2 回答 2

2

这可能是由于调用约定不匹配造成的。PInvokeStdCall默认使用,但 VC 编译器CDecl默认使用。

尝试更改为:

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

其他潜在问题是字符串编组技术。您可能需要指定要使用的编码,和/或StringBuilder作为第二个参数传递并使用它来“填充”结果。

于 2013-03-27T17:01:17.570 回答
0

.Net 框架内置了很多加密算法,包括 SHA256。尝试使用SHA256Managed类。如果你想最终解密你的密码,你需要对称加密功能,而 SHA 不是其中之一。

看看这篇文章:密码检索和存储

于 2013-03-27T17:02:49.033 回答