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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2012, 13:57   #1
Abrokadawr
 
Регистрация: 03.11.2011
Сообщений: 8
По умолчанию AES-128 (Crypto API) не шифрует

Написал библиотеку, реализующую шифрование входного файла алгоритмом AES-128 с помощью Crypto API. Вот ее код:

Код:
library Project1;

uses
  SysUtils,
  Classes, WCrypt2;

var
  hCryptAq:hCryptProv;
  hKeyHash:hCryptHash;
  hKey:hCryptKey;
  data:PByte;
  i:LongWord;

{$R *.res}

function CreateHashKey(pass:PChar):boolean;
begin
  try
    CryptCreateHash(hCryptAq, CALG_MD5, 0, 0, @hKeyHash);
    CryptHashData(hKeyHash, @pass[1], length(pass), 0);
    CryptDeriveKey(hCryptAq, CALG_AES_128, hKeyHash, 0, @hKey);
    result:=true;
  except
    result:=false;
  end;  
end;


function EncryptText(InputFile, OutputFile, pass:PChar):boolean; stdcall;
var InpF, OutF:File;
begin
  If not FileExists(InputFile) then
    begin
      result:=false;
      exit;
    end;

  try
    try
      CryptAcquireContext(@hCryptAq, nil, nil, PROV_RSA_AES, CRYPT_VERIFYCONTEXT);
      CreateHashKey(pass);

      AssignFile(InpF, InputFile);
      AssignFile(OutF, OutPutFile);

      GetMem(data, 128);

      Reset(InpF, 1);
      Rewrite(OutF, 1);

      try
        While not eof(InpF) do
          begin
            BlockRead(inpF, data^, 128, i);
            CryptEncrypt(hKey, 0, eof(InpF), 0, data, @i,i);
            BlockWrite(outF, data^, i);
          end;
        finally
          CloseFile(inpF);
          CloseFile(outF);
        end;

      result:=true;  
    except
      result:=false;
    end;
  finally
    FreeMem(data, 128);
    CryptReleaseContext(hCryptAq, 0);
  end;    
end;

exports EncryptText;
begin
end.
(если нужно) Вот код ее использования:
Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows,SysUtils,
  Classes;

var hLib:HModule;
    EncryptText:function(InputFile, OutputFile, pass:PChar):boolean; stdcall;

begin
  try
    hLib:=LoadLibrary('D:\My Files(Cent)\Программирование\Мои проекты\Недоделанные\ШИФРОВАНИЕ\project1.dll');
    EncryptText:=GetProcAddress(hLib, 'EncryptText');

    EncryptText(PChar('D:\My Files(Cent)\Программирование\inp.txt'), PChar('D:\My Files(Cent)\Программирование\out.txt'), PChar('qwerty125'));
  finally
    FreeLibrary(hLib);
  end;
end.
Содержимое входного файла:
'шла саша по шоссе и сосала чупа-чупс'

Содержимое выходного файла:
'шла саша по шоссе и сосала чупа-чупс' + несколько непонятных байт в конце (в текстовике отображаются как черные квадраты)

Вывод, что нефига файл не шифруется. Почему? Где то в DLL-ке косяк, но вот непойму где. Знатоки CryptoAPI, подскажите где я неправильно сделал?
Abrokadawr вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
EAN 128 (CODE 128) artemavd Общие вопросы Delphi 3 07.07.2012 11:21
[C++] Как использовать библиотеку crypto++ by_Trojan Общие вопросы C/C++ 0 10.05.2012 09:07
Шифрование AES Samara Помощь студентам 3 29.10.2011 18:10
Нужно написать алгоритм в СИ шефрования и дешифрования AES 128 velamut Помощь студентам 0 18.06.2010 01:08