Есть такая процедура: Код (Text): CryptKey byte 0C4h, 0F8h, 03Ch, 09Ch, 006h, 04Dh, 044h, 000, 0C4h, 0F8h, 03Ch, 09Ch, 006h, 04Dh, 044h, 000, 0C4h, 0F8h, 03Ch, 09Ch, 006h, 04Dh, 044h, 000 Data byte 099h, 020h, 08Bh, 0C6h, 037h, 0C7h, 09Fh, 08Ch, 099h, 020h, 08Bh, 0C6h, 037h, 0C7h, 09Fh, 08Ch, 099h, 020h, 08Bh, 0C6h, 037h, 0C7h, 09Fh, 08Ch IV db 0, 0, 0, 0, 0, 0, 0, 0 DesEncrypt proc uses ebx ecx edx esi edi local hProv:dword local hKey:dword local SizeOfData:dword local DESMode:dword local bKey[50h]:byte local KeyHeader:BLOBHEADER local CryptKeyLen:dword mov hProv, 0 mov hKey, 0 xor ebx, ebx invoke CryptAcquireContext, addr hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT .if hProv != 0 mov KeyHeader.bType, PLAINTEXTKEYBLOB mov KeyHeader.bVersion, CUR_BLOB_VERSION mov KeyHeader.reserved, 0 mov KeyHeader.aiKeyAlg, CALG_3DES mov ecx, sizeof KeyHeader lea esi, KeyHeader lea edi, bKey rep movsb mov CryptKeyLen, sizeof CryptKey mov ecx, CryptKeyLen mov dword ptr ds:[edi], ecx add edi, sizeof dword mov ecx, sizeof CryptKey mov esi, offset CryptKey rep movsb mov byte ptr ds:[edi], 0 invoke CryptImportKey, hProv, addr bKey, sizeof KeyHeader + sizeof dword + sizeof CryptKey, NULL, NULL, addr hKey .if hKey != 0 mov SizeOfData, sizeof Data mov DESMode, CRYPT_MODE_CBC invoke CryptSetKeyParam, hKey, KP_MODE, addr DESMode, NULL mov DESMode, ZERO_PADDING invoke CryptSetKeyParam, hKey, KP_MODE, addr DESMode, NULL invoke CryptSetKeyParam, hKey, KP_IV, addr IV, NULL invoke CryptEncrypt, hKey, NULL, NULL, NULL, offset Data, addr SizeOfData, addr SizeOfData invoke CryptDestroyKey, hKey .endif invoke CryptReleaseContext, hProv, NULL .endif ret DesEncrypt endp CryptImportKey вроде срабатывает нормано но когда доходит до крипта говорит неверный алго... Подскажите в чем неправ ?
На сколько я помню: Microsoft Base Cryptographic Provider не поддерживает функцию CryptSetKeyParam. Ты же пока не указал, какой вы провайдер используете. Больше информации. Судя по всему это Microsoft Base DSS and Diffie-Hellman Cryptographic Provider. Если это он, тогда почему вы не устанавливаете параметр KP_ALGID, он как раз указывает на алгоритм шифрования. Ибо только после этого, ключ, полученный с помощью CryptImportKey, можно использовать.
Да. Всеве верно, спасибо. Дело действительно было в провайдере - работает даже без применения CryptSetKeyParam KP_ALGID, только я не понял одного: зашифровать-зашифровали те данные в пошифрованном виде выглядят так : 99 20 8B C6 37 C7 9F 8C 99 20 8B C6 37 C7 9F 8C 99 20 8B C6 37 C7 9F 8C Но когда я после CryptEncrypt дописал CryptDecrypt c тем же hKey она мне раздекодила её в последовательность типа 27 08 D0 11 3D 11 34 7E 99 20 8B C6 37 C7 9F 8C 99 20 8B C6 37 C7 9F 8C как можно заметить, первые 8 байт данных расшифровались неправильно, и тут у меня опять ступор...
Чего-то я не понял. У вас данные: 99 20 8B C6 37 C7 9F 8C 99 20 8B C6 37 C7 9F 8C Вы их пошифровали ? Если пошифровали, то почему результат не изменился? Или это уже пошифрованные. Если пошифрованные - вам надо проверить на корректность параметр передачи размера данных для дешифрации. Чтоб не гадать, код в студию.
там все осталось практически без изменений только изменил invoke CryptAcquireContext, addr hProv, NULL, offset MS_DEF_DSS_DH_PROV, PROV_DSS_DH, CRYPT_VERIFYCONTEXT и добавил после крипт енкрипт invoke CryptDecrypt, hKey, NULL, NULL, NULL, offset Data, addr SizeOfData ВСЕ! P.S. только что заметил я вместо пошифрованных данных в предыдущем посте написал исходные пошифрованные - 1D F6 D5 74 88 AF 42 65 48 90 27 97 DC 7A AB 3E BE 28 5B D7 0A D6 AB F2 расшифрованные - 27 08 D0 11 3D 11 34 7E 99 20 8B C6 37 C7 9F 8C 99 20 8B C6 37 C7 9F 8C
Приложи проект (с инклюдами). Я посмотрю \ соберу - в чем проблема попробую узнать. Может какую то константу не добавил или она неверно описана.
Задачу опиши ? Ты хочешь заюзать 3DES или ты хочешь заюзать DSS DH алгосы? В твоем исходнике CryptImportKey не срабатывает (проверял). А все потому, что те параметры, что ты указал - неверны. На сколько я помню CALG_3DES можно юзать тока в RSA провайдерах (сразу не обратил внимания и посоветовал DSS). И мало того - кто будет генерировать сессионные ключи (CryptGenKey) ? В общем опиши, что конкретно ты хочешь сделать. Какой алгоритм хочешь использовать.
Вообщем основная цель написать для оперы unwand там юзается 3des алго для декрипта файла. Есть сишные сорцы декодера через либу openssl Libeay32.dll если нужно - выложу, но по инету она гуляет во фриваре сорцах. И данный трюк хотелось бы повторить через криптоапи. Что бы не искать в конце приаттачу. Так вот, в принципе там как и в моем сорце приблизительно одинаково - то есть как я понимаю 3des алго принимает на входе ключ 192 бит длинной и шифрует/дешифрует данные блоками такой же длины. Дело как я понимаю за малым - то есть выбором ключа и мода шифрования ebc/cbc etc. пока что то что у меня получилось это простейшая реализация cbc шифра, НО в импорте данной ssl либы есть функции такие как DES_set_key_unchecked и DES_ede3_cbc_encrypt. Первая как я понял формирует ключ заданной длины по md5 хэшам различной дребедени и результате формируя ключ необходимой длины, а вторая используя мод cbc применяет трижды дез алго encrypt/decrypt/encrypt но здесь другая непонятка - каким образом криптоапи может расшифровать данные таким образом... Я уже все коленки ободрал, ползая по просторам инета, в поисках хотя бы какой-нибудь инфы по этому поводу, но тщетно... Вот как "последняя надежда" на помощь приходит васм. Хотелось бы хотя бы что-нибудь поподробнее узнать о том как данную тему можно воплотить в жизнь.
Все ясно. Проверяйте . Я думаю комментировать не надо. Но если что - спрашивайте по существу. У вас была ошибка с инициализацией, а так же главное - Обратите внимание на структуру блоба увидите там новое значение. Плюс смотрите установку параметров. Код (Text): BLOBHEADER struct bType BYTE ? bVersion BYTE ? reserved WORD ? aiKeyAlg DWORD ? BLOBHEADER ends .const PROV_RSA_FULL equ 1 KP_IV equ 1 KP_MODE equ 4 KP_PADDING equ 3 ZERO_PADDING equ 3 CRYPT_VERIFYCONTEXT equ 0F0000000h PLAINTEXTKEYBLOB equ 8 CUR_BLOB_VERSION equ 2 ALG_CLASS_DATA_ENCRYPT equ 3 shl 13 ALG_TYPE_BLOCK equ 3 shl 9 ALG_SID_3DES equ 3 CALG_3DES equ ALG_CLASS_DATA_ENCRYPT or ALG_TYPE_BLOCK or ALG_SID_3DES CRYPT_MODE_CBC equ 1 CRYPT_MODE_ECB equ 2 ;... DesEncrypt proc uses ebx ecx edx esi edi local hProv:dword local hKey:dword local hSesKey:dword local SizeOfData:dword local DESMode:dword local bKey[50h]:byte local KeyHeader:BLOBHEADER local CryptKeyLen:dword mov hProv, 0 mov hKey, 0 xor ebx, ebx invoke CryptAcquireContext, addr hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT .if hProv != 0 mov KeyHeader.bType, PLAINTEXTKEYBLOB mov KeyHeader.bVersion, CUR_BLOB_VERSION mov KeyHeader.reserved, 0 mov KeyHeader.aiKeyAlg, CALG_3DES mov ecx, sizeof bKey xor eax,eax lea edi, bKey rep stosb mov ecx, sizeof KeyHeader lea esi, KeyHeader lea edi, bKey rep movsb mov ecx, sizeof CryptKey mov dword ptr ds:[edi], ecx add edi, sizeof dword mov ecx, sizeof CryptKey mov esi, offset CryptKey rep movsb invoke CryptImportKey, hProv, addr bKey, sizeof KeyHeader + sizeof dword + sizeof CryptKey, NULL, NULL, addr hKey .if hKey != 0 invoke MessageBox,0,0,0,0 mov SizeOfData, sizeof Data mov DESMode, CRYPT_MODE_ECB invoke CryptSetKeyParam, hKey, KP_MODE, addr DESMode, NULL mov DESMode, ZERO_PADDING invoke CryptSetKeyParam, hKey, KP_PADDING, addr DESMode, NULL invoke CryptSetKeyParam, hKey, KP_IV, addr IV, NULL invoke CryptEncrypt, hKey, NULL, NULL, NULL, offset Data, addr SizeOfData, addr SizeOfData invoke CryptDecrypt, hKey, NULL, NULL, NULL, offset Data, addr SizeOfData invoke CryptDestroyKey, hKey .endif invoke CryptReleaseContext, hProv, NULL .endif ret DesEncrypt endp
Вообщем при CRYPT_MODE_ECB все проходит гладко и шифрует и дешифрует блоками как надо, но при CBC первые 8 байт так до конца почему-то и не расшифровывает. И при установке KP_PADDING возвращает NTE_BAD_DATA. Что бы это могло значить ? Если у тебя рабочий CBC сорец, выложи плз.
Просто CBC не подходит к методу 3DEC шифрования. Я думаю он к обычному DEC идет. Я же пробовал разные варианты, и такая же ситуация как у тебя - тоже была. А чем тебя не устраивает ECB?
При расшифровке wand по-моему используется мод cbc если я все правильно понял. В тех сишных сорцах используется ф-ция DES_ede3_cbc_encrypt она принимет 3 ключа в аргументах быть может она сначала криптует первым затем расшифровывает вторым и снова шифрует 3-им, так как ede3 (как я понимаю encrypt/decrypt/encrypt) ?
MrMiXeR У меня к сожалению мало времени исследовать программу. Попытайтесь сами понять как работает эта функция. Судя по описанию это просто DES алгос. А не Triple DES. По пробуйте написать рабочий пример с СВС вариантом. По идее с CBC ключ должен быть меньше. Хотя хз. Пробуйте. Советую еще прогнать эти сорцы в отладчике. (Все же не асм - будет проще \ визуальнее понять ход работы).