从C#项目调用c本机函数

Call c native function from C# project

我正在做一个C项目,在这个项目中,我必须将一些密码存储在一个文件中。我想用sha1加密那些。我已经在一个C项目中加密/解密了sha1程序。我想从我的C_项目中调用"password_sha1_build",这是一个C函数,用于加密密码extern"c"uudeclspec(dllexport)char*password_sha1_build(char*password))。

我从"password-sha1-u build"函数所在的文件构建了一个dll,并尝试从我的C项目调用它,如下所示:

1
2
3
4
5
6
7
8
[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程序不是我自己开发的,但它包含一个名为"int password_sha1_check(char*password,char*hash)"的函数,该函数可以读取由"char*password_sha1_build(char*password)"函数生成的sha1密码。

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

1
2
3
4
5
6
7
8
9
10
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;

密码像这样存储在一个文件中:"password:sha1:576295.49880ab837e9179dd68dfb142342f368e821de43"在"."之前是salt,之后是hash

但是当C程序执行他的密码检查时,他告诉我输入的密码与存储的密码不同。我在加密方面有点弱,其他工作也很忙,所以我问自己"为什么不使用已经存在并起作用的"password-sha1-u build"函数",这就是为什么我试图从我的C程序调用这个函数。我希望这是清楚的,对不起我的英语很差。

感谢ReedCopsey:我试过了,至少Pinvoke异常被排除了,但是现在我得到了一个"accessViolationException"。因此,我们欢迎您提出更多的建议,再次感谢!


这可能是由于调用约定不匹配造成的。pinvoke默认使用StdCall,而vc编译器默认使用CDecl

尝试更改为:

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

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


.NET框架内置了许多加密算法,包括sha256。尝试使用sha256管理类。如果你想最终解密你的密码,你需要对称加密功能,而sha不是其中之一。

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