CryptEncrypt不加密整个文本

时间:2017-03-05 20:41:05

标签: c++ windows encryption cryptography wincrypt

我正在尝试使用wincrypt加密文本消息。然而,我的代码是不可预测的。它不会加密/解密整个明文,只会加密/解密整个明文。如果我改变了密码的长度(例如改为"密码123和#34;),它会加密/解密不同数量的字符。这是我的代码。

#include <windows.h>
#include <wincrypt.h>
#include <stdio.h>


int main()
{
 const char* passw = "password12";
 const char* toencrypt = "consectetur adipiscing elit. In tellus nisl,   sodales non arcu quis, sagittis maximus orci cras amet.";

 HCRYPTPROV hProv;
 HCRYPTHASH hHash;
 HCRYPTKEY hKey;
 DWORD todwSize = (DWORD)strlen(toencrypt);
 PBYTE pBuffer;

 CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_DELETEKEYSET);
 CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET);

 CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash);
 CryptHashData(hHash, (BYTE*)passw, strlen(passw), 0);
 CryptDeriveKey(hProv, CALG_RC4, hHash, 0, &hKey);

 //--------------------------------------------------------------------

 CryptEncrypt(hKey, 0, TRUE, 0, NULL, &todwSize, todwSize);

 pBuffer = (BYTE *)malloc(todwSize);
 strcpy((char*)pBuffer, toencrypt);

 CryptEncrypt(hKey, 0, TRUE, 0, pBuffer, &todwSize, todwSize);
 PBYTE pBreturn = pBuffer;
 const char* message =  (const char*)pBreturn;
 printf("%s", message); 

 //--------------------------------------------------------------------

 DWORD dwSize = (DWORD)strlen(message);
 PBYTE depBuffer;


 depBuffer = (BYTE *)malloc(1460);
 strcpy((char*)depBuffer, message);



 CryptDecrypt(hKey, 0, TRUE, 0, depBuffer, &dwSize);



 CryptDestroyKey(hKey);
 CryptDestroyHash(hHash);

 CryptReleaseContext(hProv, 0);
 if(GetLastError() != 0)
 {
   printf("%d", GetLastError());
 }
 PBYTE depBreturn = depBuffer;
 printf("%s", (const char*)depBreturn);
 printf("\n%d", strlen(message)); 
 return 0;
}

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:6)

认为你的代码加密好了,但是因为你在调用CryptDecrypt中使用了错误的长度而无法解密整个消息

您的主要错误是DWORD dwSize = (DWORD)strlen(message);strcpy((char*)depBuffer, message);,但邮件是加密缓冲区,而不是0终止ansi字符串。因此,您无法对加密数据使用strlenstrcpy - 您拥有CryptEncrypttodwSize返回的加密数据长度 - 因此您必须使用{{1}如果您需要复制加密缓冲区并按memcpy

传递todwSize

还注意到CryptDecrypt你在调用Harry Johnston中错误地使用普通数据/缓冲区大小。

首次调用时

必须为CryptEncryptCryptEncrypt(hKey, 0, TRUE, 0, NULL, &(needSize = todwSize), 0)的最后一个参数 dwBufLen 必须为0,因为您使用 NULL 作为缓冲区,并且需要使用另一个变量CryptEncrypt用于获取加密缓冲区的大小而不覆盖纯文本缓冲区(DWORD needSize)的大小,然后分配todwSize缓冲区,复制到它needSize并调用{{1但是对于RC4,加密和纯文本大小总是相等的。所以todSize总是在RC4的情况下

在您的情况下,您只需要使用标记CryptEncrypt(hKey, 0, TRUE, 0, pBuffer, &todwSize, needSize)拨打needSize == todSize一次。并始终需要检查功能结果。所以测试代码可以像这样

CryptAcquireContext