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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 03.04.2013, 17:18   #1
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию Как заставить работать модуль из D7 в DXE2

Здравствуйте, есть модуль шифрования строк который прекрасно работает на Delphi 7 и не работает на XE так как там юникод, у меня переписать под юникод не вышло, может кто нибудь поможет?
Код:
unit uCrypt;

interface

const
 CALG_RC4         = ((3 shl 13) or (4 shl 9) or 1);
 CALG_RC2         = ((3 shl 13) or (3 shl 9) or 2);
 def              = '848d33d212444f6d00dbba1a41266905';

function EncString(s: string; pass: string = def; alg: Cardinal = CALG_RC4): string;
{* зашифровать строку }
function DecString(s: string; pass: string = def; alg: Cardinal = CALG_RC4): string;
{* расшифровать строку }

implementation

const
 ADVAPI32            = 'advapi32.dll';
 PROV_RSA_FULL       = 1;
 CRYPT_VERIFYCONTEXT = $F0000000;
 CALG_SHA            = ((4 shl 13) or 0 or 4);

type
 HCRYPTPROV  = Cardinal;
 HCRYPTKEY   = Cardinal;
 ALG_ID      = Cardinal;
 PHCRYPTPROV = ^HCRYPTPROV;
 PHCRYPTKEY  = ^HCRYPTKEY;
 LPAWSTR     = PWideChar;
 HCRYPTHASH  = Cardinal;
 PHCRYPTHASH = ^HCRYPTHASH;

function CryptReleaseContext(hProv:HCRYPTPROV;dwFlags:LongWord):LongBool;stdcall;external ADVAPI32 name 'CryptReleaseContext';
function CryptAcquireContext(Prov:PHCRYPTPROV;Container:LPAWSTR;Provider:LPAWSTR;ProvType:LongWord;Flags:LongWord):LongBool;stdcall;external ADVAPI32 name 'CryptAcquireContextW';
function CryptEncrypt(Key:HCRYPTKEY;Hash:HCRYPTHASH;Final:LongBool;Flags:LongWord;Data:PBYTE;Len:PLongWord;BufLen:LongWord):LongBool;stdcall;external ADVAPI32 name 'CryptEncrypt';
function CryptDecrypt(Key:HCRYPTKEY;Hash:HCRYPTHASH;Final:LongBool;Flags:LongWord;Data:PBYTE;Len:PLongWord):LongBool;stdcall;external ADVAPI32 name 'CryptDecrypt';
function CryptCreateHash(Prov:HCRYPTPROV;Algid:ALG_ID;Key:HCRYPTKEY;Flags:LongInt;Hash:PHCRYPTHASH):LongBool;stdcall;external ADVAPI32 name 'CryptCreateHash';
function CryptHashData(Hash:HCRYPTHASH;Data:PBYTE;DataLen :LongInt;Flags:LongInt):LongBool;stdcall;external ADVAPI32 name 'CryptHashData';
function CryptDeriveKey(Prov:HCRYPTPROV;Algid:ALG_ID;BaseData:HCRYPTHASH;Flags:LongInt;Key:PHCRYPTKEY) :LongBool;stdcall;external ADVAPI32 name 'CryptDeriveKey';
function CryptDestroyHash(hHash :HCRYPTHASH) :LongBool;stdcall;external ADVAPI32 name 'CryptDestroyHash';

function ByteToHex(b: byte): string;
 function GetChar(b: byte): char;
 begin
   if b < 10 then
     Result := char(Ord('0') + b)
   else
     Result := char(Ord('A') - 10 + b);
 end;
begin
  Result := GetChar(b div 16) + GetChar(b mod 16);
end;

function StringToHex(const s: string): string;
var
  i: integer;
begin
  result := '';
  for i := 1 to Length(s) do
    result := result + ByteToHex(ord(s[i]));
end;

function StrToIntDef(s: string; def: integer): integer;
var
  i, c: integer;
begin
  Val(s, i, c);
  if c = 0 then
    Result := i
  else
    Result := def;
end;

function HexToString(const s: string): string;
var
 i: integer;
begin
 result := '';
 for i := 1 to Length(s) div 2 do
   try
     result := result + char(StrToIntDef('$' + copy(s, i*2-1, 2), 32));
   except
     result := result + '?';
   end;
end;

procedure InitPass(pass: string; alg: LongWord; var hProv: HCRYPTPROV; var hSKey: HCRYPTKEY);
var
 hash:  HCRYPTHASH;
begin
 CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
 CryptCreateHash(hProv, CALG_SHA, 0, 0, @hash);
 CryptHashData(hash, @pass[1], length(pass), 0);
 CryptDeriveKey(hProv, alg, hash, 0, @hSKey);
 CryptDestroyHash(hash);
end;

function EncString(s: string; pass: string = def; alg: Cardinal = CALG_RC4): string;
var
 p:  PByte;
 sz: LongWord;
 hProv: HCRYPTPROV;
 hSKey: HCRYPTKEY;
begin
 InitPass(pass, alg, hProv, hSKey);
 Insert(chr(Random(256)), s, 1);
 sz := Length(s);
 GetMem(p, sz + 8); move(s[1], p^, sz);
 if CryptEncrypt(hSKey, 0, true, 0, p, @sz, sz + 8) then
 begin
   SetLength(result, sz);
   move(p^, result[1], sz);
   result := StringToHex(result);
 end else result := s;
 FreeMem(p);
 CryptReleaseContext(hProv, 0);
end;

function DecString(s: string; pass: string = def; alg: Cardinal = CALG_RC4): string;
var
 p:  PByte;
 sz: LongWord;
 hProv: HCRYPTPROV;
 hSKey: HCRYPTKEY;
begin
 InitPass(pass, alg, hProv, hSKey);
 s := HexToString(s);
 sz := Length(s);
 GetMem(p, sz); move(s[1], p^, sz);
 if CryptDecrypt(hSKey, 0, true, 0, p, @sz) then
 begin
   SetLength(result, sz);
   move(p^, result[1], sz);
   delete(result, 1, 1);
 end else result := s;
 FreeMem(p);
 CryptReleaseContext(hProv, 0);
end;

initialization
 Randomize;

end.

Последний раз редактировалось dolphin705; 03.04.2013 в 17:26.
dolphin705 вне форума Ответить с цитированием
Старый 03.04.2013, 17:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Замени все String на AnsiString
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.04.2013, 17:50   #3
dolphin705
Форумчанин
 
Аватар для dolphin705
 
Регистрация: 02.08.2008
Сообщений: 213
По умолчанию

Пробовал поидее если выводить в юникодный Edit ничего не выйдет, и Char на Widechar менял тоже не выходит.

В семпле от проекта помогло переименовать все string в AnsiString, все Char в AnsiChar. А вот как всё это поведёт себя в проекте пока неизвестно ))

Последний раз редактировалось Stilet; 03.04.2013 в 21:49.
dolphin705 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заставить работать скрипт x1233 JavaScript, Ajax 8 05.12.2010 10:41
Как заставить работать CheckBox? ridmal Microsoft Office Word 1 21.05.2009 09:47
Как заставить работать NFS 2 SE? Манжосов Денис :) Gamedev - cоздание игр: Unity, OpenGL, DirectX 6 02.11.2008 16:35
Как заставить работать php? yourself Помощь студентам 9 20.05.2008 08:08
Как заставить работать dll ? Volkogriz Общие вопросы Delphi 10 13.12.2007 10:24