Поиск:

Ответ в темуСоздание новой темы Создание опроса
> объясните почему ошибка, win32. CryptoAPI 
:(
    Опции темы
turbanoff
  Дата 28.3.2010, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 57
Регистрация: 6.4.2009

Репутация: нет
Всего: 1



вот код для fasm-a. возле exe-шника лежит input.txt. Собственно вопрос почему выдает ошибку "error CryptAcquireContextA".
Какие параметры я не правильно передал CryptAcquireContextA?
 smile 
смотрел в отладчике GetLastError возвращает - 0x80090016

Код

format PE console
entry start

include 'include/win32w.inc'

section '.data' data readable writeable

        handle  dd ?    ; хэндл процесса
        hInput  dd ?    ; хэндл входного файла
        hOutput dd ?    ; хэндл выходного файла
        hService dd ?   ; хэндл служебного файла
        hStdOut dd ?    ; хэндл вывода на консоль
        hStdIn  dd ?    ; хэндл ввода c консоли

        hHeap    dd ?   ; хэндл нашей кучи

        input   db 'input.txt',0
        output  db 'output.txt',0
        service db 'service.txt',0
        pass    db 'mypass',0
        passlen dd ?

        fsize   dd ?    ; размер входного файла
        csize   dd ?    ; размер шифротекста
        buffer  dd ?    ; адрес буфера

        temp    dd ?

        hCryptProvFile dd 0   ; хэндл криптовайдера шифрующего файл (RC2) и хеш (MD5)
        hCryptProvKey  dd 0   ; хэндл криптовайдера шифрующего мастер-ключ (DES)

        hKeyFile   dd ?       ; хэндл ключа на котором шифруется файл
        hKeyKey    dd ?       ; хэндл ключа на котором шифруется мастер ключ
        hHash      dd ?       ; хэндл хэш-объекта (MD5)

        encKeyPointer dd ?    ; указатель на блоб зашифрованного ключа
        encKeySize dd ?       ; размер блоба зашифрованного ключа

        MS_ENHANCED_PROV  db 'Microsoft Enhanced Cryptographic Provider v1.0',0,0
        ;"Microsoft Strong Cryptographic Provider v1.0",0
        PROV_RSA_FULL      = 1 ;(RC2,MD5)
        PROV_RSA_SCHANNEL  = 12 ;(DES)

section '.code' code readable executable

  start:
        invoke  GetModuleHandle,0                       ; получим стандартные хендлы
        mov     [handle], eax
        invoke  GetStdHandle, STD_INPUT_HANDLE
        mov     [hStdIn], eax
        invoke  GetStdHandle, STD_OUTPUT_HANDLE
        mov     [hStdOut], eax

        invoke  CreateFileA, input,\                    ; откроем файл для чтения
                            1,\
                            NULL,\
                            NULL,\
                            OPEN_EXISTING,\
                            FILE_ATTRIBUTE_NORMAL,\
                            NULL
        cmp     eax, INVALID_HANDLE_VALUE
        jz      errorOpenFile
        mov     [hInput], eax

        invoke  GetFileSize, eax, temp      ; узнали размер
        mov     [fsize], eax

        invoke  GetProcessHeap                   ; берем "нашу" кучу
        mov     [hHeap], eax
        mov     eax, [fsize]
        add     eax, 128                        ; на всякий выделим на 128 байт больше (1024 бит)
        invoke  HeapAlloc, [hHeap], NULL, eax   ; и выделяем в ней память под весь файл
        cmp     eax, 0
        jz      errorAllocMemory
        mov     [buffer], eax


        invoke  ReadFile, [hInput], [buffer], [fsize], temp, NULL       ;читаем весь файл

        invoke  CryptAcquireContextA, hCryptProvFile, 0, MS_ENHANCED_PROV, PROV_RSA_FULL, 0
        cmp     eax, 0
        je      errorCryptProv

        invoke  GetLastError
        invoke  CryptAcquireContextA, hCryptProvKey,  0, MS_ENHANCED_PROV, PROV_RSA_SCHANNEL, 0

                                         ; magic number ~ RC2
        invoke  CryptGenKey, [hCryptProvFile], 0x00006602, 0x00000001 or 0x00800000, hKeyFile

        ;шифруем нашим ключом, без хэша, шифруем все за раз
        invoke  CryptEncrypt, [hKeyFile], 0, TRUE, 0, [buffer], csize, [fsize]
        ;и сразу пишем в выходной файл
        invoke  CreateFileA, output,2,0,0,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,0  ; создаем файл для записи
        mov     [hOutput], eax
        invoke  WriteFile, eax, [buffer], [csize], temp, NULL   ; и пишем сразу всё

        invoke  CryptCreateHash, [hCryptProvFile], 0x00008003, 0, 0, hHash ; создаем хэш-объект
        invoke  CryptHashData, [hHash], pass, [passlen], 0                 ; добавляем пасс к хэшу
        invoke  CryptDeriveKey, [hCryptProvKey], 0x00006601, [hHash],  0x00800000, hKeyKey
        invoke  CryptExportKey, [hKeyFile], [hKeyKey], 1, 0, 0, encKeySize ; узнаем размер зашифрованного ключа
        invoke  HeapAlloc, [hHeap], 0, [encKeySize]
        mov     [encKeyPointer], eax
        invoke  CryptExportKey, [hKeyFile], [hKeyKey], 1, 0, eax, encKeySize ;шифруем и экспортируем мастер-кей
        invoke  CreateFile, service,2,0,0,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 ; создаем служебный файл
        mov     [hService], eax
        invoke  WriteFile, eax, [encKeyPointer], [encKeySize], temp, 0  ; и пишем в него E(master-key)
        invoke  ExitProcess,0

  errorOpenFile:
        invoke  WriteFile, [hStdOut], .error, .len, temp, NULL
        invoke  ExitProcess,0
        .error  db 'error open file!'
        .len    = $ - .error
  errorAllocMemory:
        invoke  WriteFile, [hStdOut], .error, .len, temp, NULL
        invoke  ExitProcess,0
        .error  db 'error memory alloc!'
        .len    = $ - .error

  error:
        invoke  WriteFile, [hStdOut], .error, .len, temp, NULL
        invoke  ExitProcess,0
        .error  db 'error!'
        .len    = $ - .error
  errorCryptProv:
        invoke  WriteFile, [hStdOut], .error, .len, temp, NULL
        invoke  ExitProcess,0
        .error  db 'error CryptAcquireContextA'
        .len    = $ - .error

section '.idata' import data readable writeable

  library kernel32,'KERNEL32.DLL',\
          user32,'USER32.DLL',\
          advapi32,'ADVAPI32.DLL'

  include 'include/api/kernel32.inc'
  include 'include/api/user32.inc'
  include 'include/api/advapi32.inc'

PM MAIL   Вверх
airyashov
Дата 29.3.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 1.7.2008

Репутация: 1
Всего: 6



NTE_BAD_KEYSET( 0x80090016L )

The key container could not be opened. A common cause of this error is that the key container does not exist. To create a key container, call CryptAcquireContext using the CRYPT_NEWKEYSET flag. This error code can also indicate that access to an existing key container is denied. Access rights to the container can be granted by the key set creator by using CryptSetProvParam.

http://msdn.microsoft.com/en-us/library/aa...28VS.85%29.aspx

Это сообщение отредактировал(а) airyashov - 29.3.2010, 17:13


--------------------
icq:3(один)7748666
mail:airyashov( а )inbox.ru
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Windows/DOS"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Windows/Dos | Следующая тема »


 




[ Время генерации скрипта: 0.0656 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.