Статус: Новичок
Группы: Участники
Зарегистрирован: 03.02.2011(UTC) Сообщений: 5
|
В общем зашифровать получилось... теперь проблема с расшифровкой. Проблема в том, что код в низу, заместо исходного сообщения выдает на консоль: Код:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
Код:container --- имя контейнера закрытого ключа (в реестре, тот же что и в первом посте)
pbPublicKey --- публичный отправителя в формате PULBICKEYBLOB
cbPublicKey --- длинна массива с публичным ключом
pbSessionKey --- сессионный ключ полученный при шифровании через CryptExportKey(hSessionKey, hAgreeKey, SIMPLEBLOB, 0, NULL, dwSessionKey)
cbSessionKey --- длинна массива с сессионным ключом
pbIV --- вектор инициализации, полученный при шифровании через CryptGetKeyParam(hSessionKey, DEFS.KP_IV, IV, dwIV, 0)
pbEncryped --- зашифрованное сообщение, полученное вызовом: CryptEncrypt(hSessionKey, 0, TRUE, 0, pbEncryped, &cbEncypted, messageLength)
cbEncypted --- его длинна
Код:int testDecrypt(LPCTSTR container, BYTE* pbPublicKey, DWORD cbPublicKey, BYTE* pbSessionKey, DWORD cbSessionKey, BYTE* pbIV, BYTE* pbEncryped, DWORD cbEncypted){
int ret = 0;
HCRYPTPROV hProv = 0;
HCRYPTKEY hPrivateKey = 0;
HCRYPTKEY hSessionKey = 0;
HCRYPTKEY hAgreeKey = 0;
BYTE* msg = NULL;
// Копируем исходное сообщение
msg = (BYTE*)malloc(cbEncypted);
for(int i = 0; i < cbEncypted; i ++){
msg[i] = pbEncryped[i];
}
// Получение дескриптора контейнера получателя с именем container,
// находящегося в рамках провайдера.
if(!CryptAcquireContext(&hProv, container, NULL, PROV_GOST_2001_DH, 0)){
ret = -1;
goto exit_test;
}
// Получение дескриптора закрытого ключа получателя.
if(!CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hPrivateKey)){
ret = -2;
goto exit_test;
}
// Получение ключа согласования импортом открытого ключа отправителя
// на закрытом ключе получателя.
if( !CryptImportKey( hProv, pbPublicKey, cbPublicKey, hPrivateKey, 0, &hAgreeKey ) ){
ret = -3;
goto exit_test;
}
// Установление PRO_EXPORT алгоритма ключа согласования
ALG_ID ke_alg = CALG_PRO_EXPORT;
if(!CryptSetKeyParam(hAgreeKey, KP_ALGID, (LPBYTE)&ke_alg, 0)){
ret = -4;
goto exit_test;
}
// Получение сессионного ключа импортом зашифрованного сессионного ключа
// на ключе Agree.
if(!CryptImportKey(hProv, pbSessionKey, cbSessionKey, hAgreeKey, 0, &hSessionKey)){
ret = -5;
goto exit_test;
}
// Установка вектора инициализации - без него первые 8 байт
// расшифруются неправильно.
if(!CryptSetKeyParam(hSessionKey, KP_IV, pbIV, 0)){
ret = -6;
goto exit_test;
}
// дешифровка и печать сообщения
if(!CryptDecrypt(hSessionKey, 0, TRUE, 0, msg, &cbEncypted)){
ret = -7;
goto exit_test;
}else{
ret = cbEncypted;
for(int i = 0; i < ret; i++){
if(i%32 == 0){
printf("\n");
}
printf("%i ", msg[i] );
}
printf("\n");
}
exit_test:
return ret;
}
|