CryptEncrypt говорит: Неверный алгоритм !

Тема в разделе "WASM.CRYPTO", создана пользователем MrMiXeR, 19 окт 2009.

  1. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Есть такая процедура:

    Код (Text):
    1. 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
    2.  
    3. 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
    4. IV db 0, 0, 0, 0, 0, 0, 0, 0
    5.  
    6. DesEncrypt proc uses ebx ecx edx esi edi
    7.  
    8. local hProv:dword
    9. local hKey:dword
    10. local SizeOfData:dword
    11. local DESMode:dword
    12.  
    13. local bKey[50h]:byte
    14. local KeyHeader:BLOBHEADER
    15. local CryptKeyLen:dword
    16.  
    17.  
    18.  
    19.  
    20. mov hProv, 0
    21. mov hKey, 0
    22. xor ebx, ebx
    23.  
    24. invoke CryptAcquireContext, addr hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT
    25. .if hProv != 0
    26.  
    27.         mov KeyHeader.bType, PLAINTEXTKEYBLOB
    28.         mov KeyHeader.bVersion, CUR_BLOB_VERSION
    29.         mov KeyHeader.reserved, 0
    30.         mov KeyHeader.aiKeyAlg, CALG_3DES
    31.        
    32.        
    33.         mov ecx, sizeof KeyHeader
    34.         lea esi, KeyHeader
    35.         lea edi, bKey
    36.         rep movsb
    37.         mov CryptKeyLen, sizeof CryptKey
    38.         mov ecx, CryptKeyLen
    39.         mov dword ptr ds:[edi], ecx
    40.         add edi, sizeof dword
    41.         mov ecx, sizeof CryptKey
    42.         mov esi, offset CryptKey
    43.         rep movsb
    44.        
    45.         mov byte ptr ds:[edi], 0
    46.  
    47.         invoke CryptImportKey, hProv, addr bKey, sizeof KeyHeader + sizeof dword + sizeof CryptKey, NULL, NULL, addr hKey
    48.         .if hKey != 0
    49.                 mov SizeOfData, sizeof Data
    50.                 mov DESMode, CRYPT_MODE_CBC
    51.                 invoke CryptSetKeyParam, hKey, KP_MODE, addr DESMode, NULL
    52.                 mov DESMode, ZERO_PADDING
    53.                 invoke CryptSetKeyParam, hKey, KP_MODE, addr DESMode, NULL
    54.                 invoke CryptSetKeyParam, hKey, KP_IV, addr IV, NULL
    55.                
    56.                 invoke CryptEncrypt, hKey, NULL, NULL, NULL, offset Data, addr SizeOfData, addr SizeOfData
    57.                 invoke CryptDestroyKey, hKey
    58.         .endif
    59.         invoke CryptReleaseContext, hProv, NULL
    60. .endif
    61. ret
    62. DesEncrypt endp
    CryptImportKey вроде срабатывает нормано но когда доходит до крипта говорит неверный алго... Подскажите в чем неправ ?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    На сколько я помню: Microsoft Base Cryptographic Provider не поддерживает функцию CryptSetKeyParam. Ты же пока не указал, какой вы провайдер используете. Больше информации. Судя по всему это Microsoft Base DSS and Diffie-Hellman Cryptographic Provider. Если это он, тогда почему вы не устанавливаете параметр KP_ALGID, он как раз указывает на алгоритм шифрования. Ибо только после этого, ключ, полученный с помощью CryptImportKey, можно использовать.
     
  3. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Да. Всеве верно, спасибо. Дело действительно было в провайдере - работает даже без применения 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 байт данных расшифровались неправильно, и тут у меня опять ступор...
     
  4. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    Чего-то я не понял.
    У вас данные: 99 20 8B C6 37 C7 9F 8C 99 20 8B C6 37 C7 9F 8C
    Вы их пошифровали ? Если пошифровали, то почему результат не изменился? Или это уже пошифрованные. Если пошифрованные - вам надо проверить на корректность параметр передачи размера данных для дешифрации.
    Чтоб не гадать, код в студию.
     
  5. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    там все осталось практически без изменений только изменил

    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
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    Приложи проект (с инклюдами). Я посмотрю \ соберу - в чем проблема попробую узнать. Может какую то константу не добавил или она неверно описана.
     
  7. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Прилагаю исходники
     
  8. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    Задачу опиши ? Ты хочешь заюзать 3DES или ты хочешь заюзать DSS DH алгосы?
    В твоем исходнике CryptImportKey не срабатывает (проверял). А все потому, что те параметры, что ты указал - неверны.
    На сколько я помню CALG_3DES можно юзать тока в RSA провайдерах (сразу не обратил внимания и посоветовал DSS).
    И мало того - кто будет генерировать сессионные ключи (CryptGenKey) ?
    В общем опиши, что конкретно ты хочешь сделать. Какой алгоритм хочешь использовать.
     
  9. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Вообщем основная цель написать для оперы 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 но здесь другая непонятка - каким образом криптоапи может расшифровать данные таким образом... Я уже все коленки ободрал, ползая по просторам инета, в поисках хотя бы какой-нибудь инфы по этому поводу, но тщетно... Вот как "последняя надежда" на помощь приходит васм. Хотелось бы хотя бы что-нибудь поподробнее узнать о том как данную тему можно воплотить в жизнь.
     
  10. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    Все ясно. Проверяйте :derisive: . Я думаю комментировать не надо. Но если что - спрашивайте по существу.
    У вас была ошибка с инициализацией, а так же главное - Обратите внимание на структуру блоба увидите там новое значение. Плюс смотрите установку параметров.
    Код (Text):
    1. BLOBHEADER struct
    2.     bType BYTE ?
    3.     bVersion BYTE ?
    4.     reserved WORD ?
    5.     aiKeyAlg DWORD ?
    6. BLOBHEADER ends
    7.  
    8. .const
    9.  
    10. PROV_RSA_FULL equ 1
    11.    
    12. KP_IV equ 1
    13. KP_MODE equ 4
    14. KP_PADDING equ 3
    15. ZERO_PADDING equ 3
    16.    
    17. CRYPT_VERIFYCONTEXT equ 0F0000000h
    18.  
    19. PLAINTEXTKEYBLOB equ 8
    20. CUR_BLOB_VERSION equ 2
    21. ALG_CLASS_DATA_ENCRYPT equ 3 shl 13
    22. ALG_TYPE_BLOCK equ 3 shl 9
    23. ALG_SID_3DES equ 3
    24. CALG_3DES equ ALG_CLASS_DATA_ENCRYPT or ALG_TYPE_BLOCK or ALG_SID_3DES
    25. CRYPT_MODE_CBC equ 1
    26. CRYPT_MODE_ECB equ 2
    27.  
    28. ;...
    29. DesEncrypt proc uses ebx ecx edx esi edi
    30.  
    31. local hProv:dword
    32. local hKey:dword
    33. local hSesKey:dword
    34. local SizeOfData:dword
    35. local DESMode:dword
    36.  
    37. local bKey[50h]:byte
    38. local KeyHeader:BLOBHEADER
    39. local CryptKeyLen:dword
    40.  
    41. mov hProv, 0
    42. mov hKey, 0
    43. xor ebx, ebx
    44.  
    45. invoke CryptAcquireContext, addr hProv, NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT
    46. .if hProv != 0
    47.  
    48.         mov KeyHeader.bType, PLAINTEXTKEYBLOB
    49.         mov KeyHeader.bVersion, CUR_BLOB_VERSION
    50.         mov KeyHeader.reserved, 0
    51.         mov KeyHeader.aiKeyAlg, CALG_3DES
    52.        
    53.         mov ecx, sizeof bKey
    54.         xor eax,eax
    55.         lea edi, bKey
    56.         rep stosb
    57.        
    58.         mov ecx, sizeof KeyHeader
    59.         lea esi, KeyHeader
    60.         lea edi, bKey
    61.         rep movsb
    62.        
    63.         mov ecx, sizeof CryptKey
    64.         mov dword ptr ds:[edi], ecx
    65.         add edi, sizeof dword
    66.         mov ecx, sizeof CryptKey
    67.         mov esi, offset CryptKey
    68.         rep movsb
    69.        
    70.         invoke CryptImportKey, hProv, addr bKey, sizeof KeyHeader + sizeof dword + sizeof CryptKey, NULL, NULL, addr hKey
    71.         .if hKey != 0
    72.                 invoke MessageBox,0,0,0,0
    73.                 mov SizeOfData, sizeof Data
    74.                 mov DESMode, CRYPT_MODE_ECB
    75.                 invoke CryptSetKeyParam, hKey, KP_MODE, addr DESMode, NULL
    76.                 mov DESMode, ZERO_PADDING
    77.                 invoke CryptSetKeyParam, hKey, KP_PADDING, addr DESMode, NULL
    78.                 invoke CryptSetKeyParam, hKey, KP_IV, addr IV, NULL
    79.                
    80.                 invoke CryptEncrypt, hKey, NULL, NULL, NULL, offset Data, addr SizeOfData, addr SizeOfData
    81.                 invoke CryptDecrypt, hKey, NULL, NULL, NULL, offset Data, addr SizeOfData
    82.                 invoke CryptDestroyKey, hKey
    83.  
    84.         .endif
    85.         invoke CryptReleaseContext, hProv, NULL
    86. .endif
    87. ret
    88. DesEncrypt endp
     
  11. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    Вообщем при CRYPT_MODE_ECB все проходит гладко и шифрует и дешифрует блоками как надо, но при CBC первые 8 байт так до конца почему-то и не расшифровывает. И при установке KP_PADDING возвращает NTE_BAD_DATA. Что бы это могло значить ? Если у тебя рабочий CBC сорец, выложи плз.
     
  12. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    Просто CBC не подходит к методу 3DEC шифрования. Я думаю он к обычному DEC идет.
    Я же пробовал разные варианты, и такая же ситуация как у тебя - тоже была. А чем тебя не устраивает ECB?
     
  13. MrMiXeR

    MrMiXeR New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2008
    Сообщения:
    97
    При расшифровке wand по-моему используется мод cbc если я все правильно понял. В тех сишных сорцах используется ф-ция DES_ede3_cbc_encrypt она принимет 3 ключа в аргументах быть может она сначала криптует первым затем расшифровывает вторым и снова шифрует 3-им, так как ede3 (как я понимаю encrypt/decrypt/encrypt) ?
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.551
    Адрес:
    Russia
    MrMiXeR
    У меня к сожалению мало времени исследовать программу. Попытайтесь сами понять как работает эта функция. Судя по описанию это просто DES алгос. А не Triple DES.
    По пробуйте написать рабочий пример с СВС вариантом. По идее с CBC ключ должен быть меньше. Хотя хз. Пробуйте.
    Советую еще прогнать эти сорцы в отладчике. (Все же не асм - будет проще \ визуальнее понять ход работы).