HCRYPTPROV hProv=0;//дескриптор криптопровайдера
HCRYPTKEY hKey; //дескриптор ключа
char Buf[] = "11111111";
char Buf2[]= "22222222";
DWORD Len,Len1,Len2;
int _tmain(int argc, _TCHAR* argv[])
{
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,0))
if ((unsigned)GetLastError()==NTE_BAD_KEY_STATE)
CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,CRYPT_NEWKEYSET);
if (!CryptGenKey(hProv, CALG_DES,
CRYPT_ENCRYPT | CRYPT_DECRYPT, &hKey))
{
return 0;
}
//CryptDestroyHash(hHash);
Len = strlen(Buf);
printf("Err %d \n Len:%d \nPlain text:%s \n",GetLastError(),Len,Buf);
printf("Err %d \n Len:%d \nPlain text:%s \n------------------\n",GetLastError(),Len,Buf2);
CryptEncrypt(hKey,0,0,0,(BYTE*)Buf,&Len,strlen(Buf));
printf("Err %d \n Len:%d \nCipher text:%s \n",GetLastError(),Len,Buf);
Len2 = strlen(Buf2);
CryptEncrypt(hKey,0,0,0,(BYTE*)Buf2,&Len2,strlen(Buf2));
printf("Err %d \n Len2:%d \nCipher text:%s \n------------------\n",GetLastError(),Len2,Buf2);
CryptDecrypt(hKey,0,0,0,(BYTE*)Buf,&Len);
CryptDecrypt(hKey,0,0,0,(BYTE*)Buf2,&Len2);
printf("Err %d \n Len:%d \nPlain text:%s \n",GetLastError(),Len,Buf);
printf("Err %d \n Len2:%d \nPlain text:%s \n------------------\n",GetLastError(),Len2,Buf2);
//CryptExportKey(hKey,NULL,PUBLICKEYBLOB,0,(BYTE *)kkk,&Len);
getch();
return 0;
}
CryptoAPI DES проблема с дешифровкой
Код:
Есть такой небольшой код, шифрование происходит нормально, но при дешифровке первый блок Buf не восстанавливается... При попытке указать последний блок Buf2 финальным вообще каша получается в памяти и ошибка либо -27878234987 или 234. Помогите разобраться. Спасибо.
По прочитанному мною материалу вроде всё так, должно работать....Только память в конце не освобождается)...
P.S. Я основывалась на статьях
http://linux-admin.net.ru/content/892
http://www.rsdn.ru/article/crypto/usingcryptoapi.xml#E5IAE
stdio.h для printf...
Код:
#include <stdio.h>
#include <tchar.h>
#include <wincrypt.h>
#include <conio.h>
#include <tchar.h>
#include <wincrypt.h>
#include <conio.h>
Может среда не та? я компилирую в студии 2005, ты тоже?
Я посмотрела описание функции шифрования:
Код:
BOOL CryptEncrypt
(
HCRYPTKEY hKey, //[In] Handle to the encryption key.
HCRYPTHASH hHash, //[In] Handle to a hash object.
BOOL Final, //[In] TRUE if this is the last section to encrypt.
DWORD dwFlags, //[In] Can be CRYPT_OAEP.
BYTE* pbData, //[In/Out] Data to be encrypted. Contains encrypted data after call.
DWORD* pdwDataLen, //[In/Out] Length of the data to encrypt. Contains the length of the encrypted data after call.
DWORD dwBufLen //[In] Length of the input pbData buffer.
)
(
HCRYPTKEY hKey, //[In] Handle to the encryption key.
HCRYPTHASH hHash, //[In] Handle to a hash object.
BOOL Final, //[In] TRUE if this is the last section to encrypt.
DWORD dwFlags, //[In] Can be CRYPT_OAEP.
BYTE* pbData, //[In/Out] Data to be encrypted. Contains encrypted data after call.
DWORD* pdwDataLen, //[In/Out] Length of the data to encrypt. Contains the length of the encrypted data after call.
DWORD dwBufLen //[In] Length of the input pbData buffer.
)
У тебя параметер Final равен 0 и в первом и во втором случае, т.е. шифруемый блок не последний. Если попробовать один блок зашифровать и указать Final=1? И ещё проверь что возвращает функция true или false (т.е успешное выполнение шифрования или нет).
Также параметер Final есть в дешифровке, он у тебя в обоих случаях равен 0 (для двух блоков для дешифровки следует указать для первого блока 0 для второго 1). Также проверь возвращаемое значение функции CryptDecrypt.
Я основываюсь на источниках
http://source.winehq.org/WineAPI/CryptEncrypt.html
http://msdn2.microsoft.com/en-us/library/aa379913(VS.85).aspx
Код:
#pragma comment(lib,"Advapi32.lib")
#include <stdio.h>
#include <tchar.h>
#include <wincrypt.h>
#include <conio.h>
#include <stdio.h>
#include <tchar.h>
#include <wincrypt.h>
#include <conio.h>
Комилируется с 5 предупреждениями и на генерации ключа выдаёт 87 ошибку(
#include <conio.h>
#include <tchar.h>
#include <windows.h>
#include <wincrypt.h>
#include <malloc.h>
вот
консольное приложение
все запускается спокойно
насчет тру и фалс еще не проверял
а на счет финальный не финальный блок как только я не пробовал...
_ftprintf(stderr, TEXT("Error number %d\n------------\n"), GetLastError());
и после вызова
Код:
if (!CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL,0))
if ((unsigned)GetLastError()==NTE_BAD_KEY_STATE)
CryptAcquireContext(&hProv, NULL, NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET);
if ((unsigned)GetLastError()==NTE_BAD_KEY_STATE)
CryptAcquireContext(&hProv, NULL, NULL,PROV_RSA_FULL,CRYPT_NEWKEYSET);
возникает системная ошибка 87 (т.е The parameter is incorrect.). Выяснила, что PROV_RSA_FULL не поддерживает DES. Если использовать DES, то лучше брать PROV_DH_SCHANNEL или PROV_MS_EXCHANGE.
Если взять PROV_DH_SCHANNEL, то возникает ошибка 87. А если взять PROV_MS_EXCHANGE, то возникает системная ошибка 127 ( The specified procedure could not be found.) Почему не может быть найдена??? не пойму...
Ладно..я игнорирую эту ошибку. После кодирования блока возникает ошибка:0x80090004 (Bad length.), а после декодирования возникает 0x80090005(Bad data.)
:mad: просто ума не приложу что делать...
1) не выделена достаточная память для Buf[] и Buf2[], т.к. функция CryptEncrypt в Buf[] и Buf2[] возвращает зашифрованный текст( а он большего размера)
2) CryptEncrypt(hKey,0,0,0,(BYTE*)Buf,&Len,strlen(Buf)); - &Len,strlen(Buf) - эти значения не верные для кодирования.