2013-03-27 1 views
1

저는 파일, 일부 암호를 저장해야하는 C# 프로젝트에서 작업하고 있습니다. sha1로 암호화하고 싶습니다. C 프로젝트에서 sha1 prog을 암호화/해독합니다. 내 C# 프로젝트에서 암호 extern "C"__declspec (dllexport) char * Password_SHA1_Build (char * Password)를 암호화하는 C 함수 인 "password_sha1_build"를 호출하려고합니다. C# 프로젝트에서 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가 서명과 일치하지 않습니다 ... 불균형합니다. 문자열/char *를 사용하고 있다는 사실에서 문제가 발생할 수 있지만, 그럴 경우 처리 할 수 ​​있습니까? ..

감사합니다. 모두에게


답장을 보내 주셔서 감사합니다.

나는 내 주제에서 내가 분명하지 않다는 것을 알았다. "서버"로 사용되는 C 프로그램은 infos.cfg라는 파일을 읽고 여기서 C# -program에 암호화 된 암호가 저장됩니다. C 프로그램 자체는 개발되지 않았지만 "char * Password_SHA1_Build (char * Password)"함수로 빌드 된 sha1 암호를 읽을 수있는 "int Password_SHA1_Check (char * Password, char * Hash) ".

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#에서 SHA1과 암호를 저장하려고 "암호 : SHA1 : 576295.49880ab837e9179dd68dfb142342f368e821de43를" "."을하기 전에 소금이고 이후 해시입니다

하지만 C 프로그램이 그의 Password_SHA1_Check를 실행할 때 입력 한 암호가 저장된 암호와 같지 않다고 알려줍니다. 나는 암호가 약해서 다른 작품들로 바쁘다. 그래서 나는 "Password_SHA1_Build"함수를 사용하지 않고 "C# programm"에서이 함수를 호출하려고하는 이유를 설명한다. 나는 그것이 명확하다 희망한다, 나는 유감 스럽다 나의 영어는 확실히 나쁘다.

Reed Copsey : 고마워. 나는 적어도 Pinvoke 예외를 무시했지만 이제는 "AccessViolationException"을 얻었습니다. 그래서 더 이상 아이디어가 다시 한번 감사드립니다!

+0

당신이 그물의 SHA1 구현을 사용하지 않는 이유는 무엇입니까? –

+0

데이터 마샬링에서 문제가 될 수 있습니다. http://msdn.microsoft.com/en-us/magazine/cc164123.aspx –

+0

"대답"은 정말 질문에 대한 업데이트이므로 병합했습니다. 새 정보를 추가하려면 질문을 편집하십시오. – ChrisF

답변

2

이것은 잠재적으로 불일치하는 호출 규칙 때문입니다. PInvoke는 기본적으로 StdCall을 사용하지만 VC 컴파일러는 기본적으로 CDecl을 사용합니다. 로 변경

시도 :

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

다른 잠재적 인 문제는 기술을 마샬링 문자열입니다. 사용할 인코딩을 지정하고/또는 StringBuilder을 두 번째 매개 변수로 전달하여 결과를 "채울"수 있습니다.

0

.Net 프레임 워크에는 SHA256을 비롯한 많은 암호화 알고리즘이 내장되어 있습니다. SHA256Managed 클래스를 사용해보십시오.그리고 암호를 암호 해독하려면 대칭 암호화 기능이 필요하며 SHA는 그 중 하나가 아닙니다.

이 게시물에서보세요 : Password retrieval and storage

관련 문제