wincrypt로 파일 조각을 해독하려고하는데이 함수를 올바르게 해독 할 수없는 것처럼 보입니다. 바이트는 C#에서 RC2 구현으로 암호화되며 동일한 암호와 IV를 암호화 및 암호 해독 프로세스 (C#으로 암호화, C++에서 해독)에 모두 공급합니다.Wincrypt : C#에서 암호화 된 파일의 암호를 해독 할 수 없습니다. NTE_BAD_DATA at CryptDecrypt
내 모든 기능은 최종 "CryptDecrypt"기능까지 true를 반환합니다. 더 이상 입력하지 않고 여기에 함수가 있습니다.
static char* DecryptMyFile(char *input, char *password, int size)
{
HCRYPTPROV provider = NULL;
if(CryptAcquireContext(&provider, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
{printf("Context acquired.");}
else
{
if (GetLastError() == NTE_BAD_KEYSET)
{
if(CryptAcquireContext(&provider, 0, NULL, PROV_RSA_FULL, CRYPT_NEWKEYSET))
{printf("new key made.");}
else
{
printf("Could not acquire context.");
}
}
else
{printf("Could not acquire context.");}
}
HCRYPTKEY key = NULL;
HCRYPTHASH hash = NULL;
if(CryptCreateHash(provider, CALG_MD5, 0, 0, &hash))
{printf("empty hash created.");}
else
{printf("could not create hash.");}
if(CryptHashData(hash, (BYTE *)password, strlen(password), 0))
{printf("data buffer is added to hash.");}
else
{printf("error. could not add data buffer to hash.");}
if(CryptDeriveKey(provider, CALG_RC2, hash, 0, &key))
{printf("key derived.");}
else
{printf("Could not derive key.");}
DWORD dwKeyLength = 128;
if(CryptSetKeyParam(key, KP_EFFECTIVE_KEYLEN, reinterpret_cast<BYTE*>(&dwKeyLength), 0))
{printf("success");}
else
{printf("failed.");}
BYTE IV[8] = {0,0,0,0,0,0,0,0};
if(CryptSetKeyParam(key, KP_IV, IV, 0))
{printf("worked");}
else
{printf("faileD");}
DWORD dwCount = size;
BYTE *decrypted = new BYTE[dwCount + 1];
memcpy(decrypted, input, dwCount);
decrypted[dwCount] = 0;
if(CryptDecrypt(key,0, true, 0, decrypted, &dwCount))
{printf("succeeded");}
else
{printf("failed");}
return (char *)decrypted;
}
입력은 암호화 된 함수로 전달되는 데이터입니다. password는 C#에서 데이터를 암호화하는 데 사용 된 것과 동일한 암호입니다. size는 암호화 된 데이터의 크기입니다.
위의 모든 함수는 CryptDecrypt가 true가 될 때까지 true를 반환합니다. 그 이유는 알 수 없습니다. 동시에, CryptDecrypt 함수가 내 "암호 해독"변수를 편집하는 방법을 잘 모릅니다. 참조를 전달하지 않기 때문입니다.
왜 이것이 작동하지 않는지에 대한 도움이나 조언은 크게 감사하겠습니다. 이것은 wincrypt와 C++을 처음 사용하면서 처음으로 시도한 작업입니다.
public static byte[] EncryptString(byte[] input, string password)
{
PasswordDeriveBytes pderiver = new PasswordDeriveBytes(password, null);
byte[] ivZeros = new byte[8];
byte[] pbeKey = pderiver.CryptDeriveKey("RC2", "MD5", 128, ivZeros);
RC2CryptoServiceProvider RC2 = new RC2CryptoServiceProvider();
//using an empty initialization vector for convenience.
byte[] IV = new byte[8];
ICryptoTransform encryptor = RC2.CreateEncryptor(pbeKey, IV);
MemoryStream msEncrypt = new MemoryStream();
CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
csEncrypt.Write(input, 0, input.Length);
csEncrypt.FlushFinalBlock();
return msEncrypt.ToArray();
}
내가 ++ C에서 내 해시 값이 만든 C#에서 내 키와 동일 있음을 확인했다 :
는 더 이상 도움이 경우는 물론, 이것은 (C#에서) 내 암호화입니다 PasswordDeriveBytes.CryptDeriveKey
GetLastError()를 호출하여 오류 코드 (NTE_BAD_DATA, NTE_BAD_KEY, NTE_BAD_LEN 등)를 얻으려고합니다. –
올바른 오류입니다. 그리고 나쁜 데이터를 얻었습니다. – Chris