나는이 함수의 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가 작동합니다.
미리 감사드립니다.
비슷한 질문 : http://stackoverflow.com/questions/1591070/cryptencrypt-api – Kimberly