Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2009, 22:45   #1
max38934
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 43
По умолчанию Алгоритм АЕS шифрование, расшифрование

Подскажите пожалуйста кто сталкивался, если необходимо шифрование алгоритмом AES с помощью CryptoAPI, где именно нужно указывать, что шифрование будет именно этим алгоритмом (необходимо определенный криптопровайдер или определенный тип?)
Код:
CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT)
Заранее очень благодарен!
max38934 вне форума Ответить с цитированием
Старый 25.05.2009, 10:54   #2
max38934
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 43
По умолчанию

Необходимо использовать :
тип = PROV_RSA_AES, имя = MS_ENH_RSA_AES_PROV .

Я обращаюсь через библиотеку wcrypt2.pas, но в ней нет - PROV_RSA_AES, имеется PROV_RSA_FULL и др. Что делать?
max38934 вне форума Ответить с цитированием
Старый 25.05.2009, 11:27   #3
max38934
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 43
По умолчанию

Код:
public
    { Public declarations }
    hProv: HCRYPTPROV;
    key: HCRYPTKEY;
    encrypt: boolean;
  end;
....
var hProv: HCRYPTPROV;
    hash: HCRYPTHASH;
    key: HCRYPTKEY;
    data: PByte;
    l: DWORD;
    fl:boolean;
    i:integer;
    err,login,cript_rez: string;
    cript_temp_1:array[0..65535] of char;
    cript_temp_2:string[255];
Const PROV_RSA_AES=24;
....
{получаем контекст криптопровайдера}
CryptAcquireContext(@hProv, nil, nil, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);

{создаем хеш-объект}
CryptCreateHash(hProv, CALG_SHA, 0, 0, @hash);

{хешируем пароль}
CryptHashData(hash, @password[1], length(password), 0);

{создаем ключ на основании пароля для потокового шифра RC4}
CryptDeriveKey(hProv, CALG_RC4, hash, 0, @key);

{уничтожаем хеш-объект}
CryptDestroyHash(hash);

{выделяем место для буфера}
    GetMem(data, 512);
      {шифруем данные}
      login:=text; //данные
      fl:=true;
      l:=length(login);
      for i:=1 to length(login) do
      begin
      data^:=ord(login[i]);
      CryptEncrypt(key, 0, fl, 0, data, @l, l);

      cript_temp_1[i]:=chr(data^);
      cript_temp_2[i]:=cript_temp_1[i];
      login[i]:=cript_temp_2[i];   //рез-т шифрования
    end;
    {освобождаем место и закрываем файлы}
    FreeMem(data, 512);
    {освобождаем контекст криптопровайдера}
    CryptReleaseContext(hProv, 0);
Данный код реализован был для шифра RC4, а как для AES сделать?
max38934 вне форума Ответить с цитированием
Старый 25.05.2009, 12:23   #4
max38934
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 43
По умолчанию

Необходимо указать алгоритм - AES или CALG_AES, а там нет что делать?
Код:
CryptDeriveKey(hProv, CALG_RC4, hash, 0, @key)
max38934 вне форума Ответить с цитированием
Старый 25.05.2009, 13:17   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Не уверен, но возможно поможет.
http://www.cryptopro.ru/Cryptopro/forum/view.asp?q=2347
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 25.05.2009, 13:42   #6
max38934
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 43
По умолчанию

Я по находил const.
А вот когда зашифровываю текст, то выдается ошибка 'Unknown error', в чем может быть причина?
Код:
{получаем контекст криптопровайдера}
CryptAcquireContext(@hProv, nil, nil, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
 {создаем хеш-объект}
CryptCreateHash(hProv, CALG_SHA, 0, 0, @hash);
  {хешируем пароль}
CryptHashData(hash, @password[1], length(password), 0);
  {создаем ключ на основании пароля для AES_256}
CryptDeriveKey(hProv,CALG_AES_256,hash,0,@key);
..
{выделяем место для буфера}
    GetMem(data, 512);
    {шифруем данные}
      login:=text; //данные
      fl:=true;
      l:=length(login);
      for i:=1 to length(login) do
      begin
      data^:=ord(login[i]);
      if not CryptEncrypt(key, 0, fl, 0, data, @l, l) then
            begin
            case int64(GetLastError) of
            ERROR_INVALID_HANDLE: err := 'ERROR_INVALID_HANDLE';
            ERROR_INVALID_PARAMETER: err := 'ERROR_INVALID_PARAMETER';
            NTE_BAD_ALGID: err := 'NTE_BAD_ALGID';
            NTE_BAD_DATA: err := 'NTE_BAD_DATA';
            NTE_BAD_FLAGS: err := 'NTE_BAD_FLAGS';
            NTE_BAD_HASH: err := 'NTE_BAD_HASH';
            NTE_BAD_HASH_STATE: err := 'NTE_BAD_HASH_STATE';
            NTE_BAD_KEY: err := 'NTE_BAD_KEY';
            NTE_BAD_LEN: err := 'NTE_BAD_LEN';
            NTE_BAD_UID: err := 'NTE_BAD_UID';
            NTE_DOUBLE_ENCRYPT: err := 'NTE_DOUBLE_ENCRYPT';
            NTE_FAIL: err := 'NTE_FAIL';
            NTE_NO_MEMORY: err := 'NTE_NO_MEMORY';
            else err := 'Unknown error';                     //      <--  выдается данное сообщение
            end;
            MessageDlg('Error of CryptEncrypt: '+err,
                         mtError, [mbOK], 0);
            exit;
            end;
      cript_temp_1[i]:=chr(data^);
      cript_temp_2[i]:=cript_temp_1[i];
      login[i]:=cript_temp_2[i];   //рез-т шифрования
max38934 вне форума Ответить с цитированием
Старый 25.05.2009, 14:00   #7
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Пусть выведет, что пришло по GetLastError, или положи сюда екзешник, я гляну.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 25.05.2009, 14:14   #8
max38934
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 43
По умолчанию

http://imagedesign.com.ua/max/1.rar
max38934 вне форума Ответить с цитированием
Старый 25.05.2009, 14:15   #9
max38934
Пользователь
 
Регистрация: 04.02.2009
Сообщений: 43
По умолчанию

button 1 - Зашифрование
___________________
Ошибка одна и та же: (разными путями)
1
Код:
ERROR CRYPTENCRYPT -- Unknown error
2 else err := 'Unknown error'; заменить на else RaiseLastOSError;
Код:
System Error. Code:234.
Имеются дополнительные данные. Process stopped/ Use step or run to continue/
3 else err := 'Unknown error'; заменить на
else
begin
FormatMessage(FORMAT_MESSAGE_FROM_S YSTEM,nil,e,0,mbuf,sizeof(mbuf),nil );
err:=IntToStr(e)+#13#10+mbuf;
end;
Код:
Error of CryptEncrypt : 21
Устройство не готово

Последний раз редактировалось max38934; 25.05.2009 в 14:29.
max38934 вне форума Ответить с цитированием
Старый 25.05.2009, 15:02   #10
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Я с crypto api раньше не работал,но
Во-первых, у того, что я скачал не отображается окно, соотв и button1 нажать не могу.
во-втрорых, а зачем шифровать в цикле почему не.
Код:
 login:=text; //данные
      fl:=true;
      l:=length(login);
      if not CryptEncrypt(key, 0, fl, 0, login, @l, l) then
?

UPD:
Написал аналог. Он воврашает ошибку ERROR_MORE_DATA. К чему бы это?
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 25.05.2009 в 19:29.
Goodwin98 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шифрование Sanakan Помощь студентам 0 19.04.2009 14:55
шифрование Stanislav Свободное общение 10 04.03.2008 05:09
расшифрование текста с помощью генератора ПСЧ MARGO Помощь студентам 0 30.11.2007 19:11
Шифрование Stanislav Общие вопросы Delphi 2 15.11.2007 21:56