2011-03-20 3 views
0

나는이 함수의 wierd 동작을 관찰하고 있는데, 암호화 할 문자열에는 14 바이트가 들어 있습니다. 버퍼의 길이를 보내기 위해 함수를 사용하면 14가 실패합니다. ("내부 오류"- 매우 설명적이고 가장 유용한 오류 코드), 버퍼 길이 (및 버퍼 자체)가 128 바이트 일 때 작동합니다. 나는 그 바이트를 해독 할 때Pinvoking adwapi.dll - cryptDecrypt 및 cryptEncrypt 함수, 이상한 문제

, 나는 다시 한 번 기능을 제공합니다 (I 암호화 할 것을)

나는 크기 128 바이트 배열을함으로써이 문제를 극복하고 난 일반 텍스트에서 14 바이트를 복사 전체 128 바이트 배열 (이제는 모든 바이트가 암호화되어 있고, # 13- # 127 (예상되는 것 같습니다)). 다행히 나를 위해 처음 14 바이트는 해독해야하고 나머지는 횡설수설합니다.

내가 들어오는 버퍼가 128 바이트 크기가 크지 않고 왜 암호 해독 기능에도 128 바이트 배열이 필요한 경우 왜 암호화 방법이 실패하는지 알고 싶습니다.

이 내가 암호화 함수를 호출하는 방법입니다

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); // encoding type 
byte[] buff = new byte[128];  // this is my buffer array, instantiated and initiated 
string String2Encrypt = "Testing";  // this is the string I need encrypted 
byte[] tempo = encoding.GetBytes(String2Encrypt); // getting bytes from string 
Buffer.BlockCopy(tempo, 0, buff, 0, tempo.Length); // copying the small array into the large one 
uint inputlength = Convert.ToUInt32(tempo.Length); // getting the size of the small array 


bool DidIt = UnsafeNativeMethods.CryptEncrypt(MyKey, IntPtr.Zero, 1, 0, buff, ref inputlength, outputdatalength);  // calling the function 

//이 경우,있는 MyKey는 3 일 "true"를 (더 이상 데이터)입니다, 두번째 인수가 null 인 암호화 키에 대한 포인터이다 그것은 7이 경우에는 플래그, 버퍼의 바이트 배열 (128) Testing.Length 128

이없는 I는 해독 방법

IntPtr UserKeyLocal = MyUserKey;  // taking an argument (MyUserKey) and "filling" the local variable, not really relevant 
byte[] dataCopy = new byte[buff.Length]; // init and insta the datacopy array (128 byte) 
Buffer.BlockCopy(buff, 0, dataCopy, 0, (int)buff.Length); // copying the argument array into a local version (I used this for testing to go around another problem), irrelevant 
uint locinputlength = inputlength; // another argument made local 
bool DidIT = UnsafeNativeMethods.CryptDecrypt(UserKeyLocal, IntPtr.Zero, true, 0, dataCopy, ref locinputlength);  // calling the function 

결과는 다음과 같을 것이다 : 테스팅 △ R △ 7 △ q △ △ △ ▽ △ ▽ ▽ ↑ ↑ ↑ 74 ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑) [ηS] Ct [n] [수학 식 12] [수학 식 12] [수학 식 12] [수학 식 12] [수학 식 12] [수학 식 12]

의도 한대로 작동하지만 부분 문자열처럼 트릭을 사용하지 않고 문자열의 "테스트"부분 만 가져올 수 있어야합니다.

나는 무엇을하려고 하는가? 필자는 스마트 카드를 내 보낸 인증서의 "공개 키"로 암호화 된 "테스트 중"의 바이너리 (파일)를 가지고 있습니다. 비공개 키와 함께 스마트 카드 (해당 CSP를 사용하고 있습니다)를 사용하여이 파일을 확인 (암호 해독)해야합니다. 보시다시피 ALMOST가 작동합니다.

미리 감사드립니다.

+0

비슷한 질문 : http://stackoverflow.com/questions/1591070/cryptencrypt-api – Kimberly

답변

2

버퍼가 128 바이트 여야하는 이유는 블록 암호가 사용되고 있다는 것입니다. 이 경우 버퍼 길이는 블록 크기의 배수 여야합니다. 블록 보호기를 사용하면 암호화 된 데이터 또는 해독 된 데이터를 길이 (암호화 됨)! = 길이 (일반 텍스트)로 쓸 수 있도록 버퍼가 데이터 크기보다 커야 할 수 있습니다.

CryptDecrypt를 호출하면 pdwDataLen (코드에 locInputLength) 매개 변수에 해독 된 실제 데이터의 길이가 포함됩니다. 처음으로 바이트의 dataCopy 바이트 만 가져 가면 필요한 것을 얻을 수 있습니까?

참고 : http://msdn.microsoft.com/en-us/library/aa379913(VS.85).aspx http://msdn.microsoft.com/en-us/library/aa379924(VS.85).aspx

0

그래, 그것을 행한! 파이처럼 쉽게!다시 약간의 단계와 약간 다른 관점에서 것을 볼 때까지 그냥 해달라고 "을 참조하십시오"그런 일이

  byte[] buffer = new byte[locinputlength]; 
      Buffer.BlockCopy(dataCopy, 0, buffer, 0, (int)locinputlength); 
      return buffer; 

하나)