Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.11.29;
Скачать: CL | DM;

Вниз

Шифрование строки.   Найти похожие ветки 

 
fantasy   (2009-10-14 08:29) [0]

Вот нашол в инете модуль

unit Crypt;

interface

uses Windows, SysUtils;

type
 HCRYPTPROV  = ULONG;
 HCRYPTKEY   = ULONG;

 TPassSaver = class
 private
   hProv: HCRYPTPROV;   // криптопровайдер
   hSKey: HCRYPTKEY;    // сессионный ключ
 public
   constructor Create(pass: string);
   {* конструктор }
   destructor Destroy; override;
   {* деструктор }
   function HideStr(s: string): string;
   {* зашифровать строку }
   function ShowStr(s: string): string;
   {* расшифровать строку }
 end;

implementation

const
 ADVAPI32    = "advapi32.dll";
 PROV_RSA_FULL    = 1;
 CRYPT_VERIFYCONTEXT = $F0000000;
 CALG_RC4         = ((3 shl 13) or (4 shl 9) or 1);
 CALG_RC2         = ((3 shl 13) or (3 shl 9) or 2);
 CALG_SHA         = ((4 shl 13) or 0 or 4);

Type
 ALG_ID = ULONG;
 PHCRYPTPROV = ^HCRYPTPROV;
 PHCRYPTKEY  = ^HCRYPTKEY;
 LPAWSTR = PWideChar;
 HCRYPTHASH  = ULONG;
 PHCRYPTHASH = ^HCRYPTHASH;
function CryptReleaseContext(hProv:HCRYPTPROV;dwFlags:DWORD):BOOL;stdcall;external ADVAPI32 name "CryptReleaseContext";
function CryptAcquireContext(Prov:PHCRYPTPROV;Container:LPAWSTR;Provider:LPAWSTR;ProvType :DWORD;Flags:DWORD):BOOL;stdcall;external ADVAPI32 name "CryptAcquireContextW";
function CryptEncrypt(Key:HCRYPTKEY;Hash:HCRYPTHASH;Final:BOOL;Flags:DWORD;Data:PBYTE;Len :PDWORD;BufLen:DWORD):BOOL;stdcall;external ADVAPI32 name "CryptEncrypt";
function CryptDecrypt(Key:HCRYPTKEY;Hash:HCRYPTHASH;Final:BOOL;Flags:DWORD;Data:PBYTE;Len :PDWORD):BOOL;stdcall;external ADVAPI32 name "CryptDecrypt";
function CryptCreateHash(Prov:HCRYPTPROV;Algid:ALG_ID;Key:HCRYPTKEY;Flags:LongInt;Hash:PH CRYPTHASH):BOOL;stdcall;external ADVAPI32 name "CryptCreateHash";
function CryptHashData(Hash:HCRYPTHASH;Data:PBYTE;DataLen :LongInt;Flags:LongInt):BOOL;stdcall;external ADVAPI32 name "CryptHashData";
function CryptDeriveKey(Prov:HCRYPTPROV;Algid:ALG_ID;BaseData:HCRYPTHASH;Flags:LongInt;Ke y:PHCRYPTKEY) :BOOL;stdcall;external ADVAPI32 name "CryptDeriveKey";
function CryptDestroyHash(hHash :HCRYPTHASH) :BOOL;stdcall;external ADVAPI32 name "CryptDestroyHash";

constructor TPassSaver.Create(pass: string);
var
 hash: HCRYPTHASH;
begin
 inherited Create;
 CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
 CryptCreateHash(hProv, CALG_SHA, 0, 0, @hash);
 CryptHashData(hash, @pass[1], length(pass), 0);
 // Если в следующей строке заменить RC4 на RC2, то будет блочное шифрование
 // оно лучше тем, что в закрытом варианте кол-во символов неочевидно
 CryptDeriveKey(hProv, CALG_RC4, hash, 0, @hSKey);
 CryptDestroyHash(hash);
end;

destructor TPassSaver.Destroy;
begin
 CryptReleaseContext(hProv, 0);
 inherited;
end;

function StringToHex(s: string): string;
var
 i: integer;
begin
 result := "";
 for i := 1 to Length(s) do
   result := result + IntToHex(ord(s[i]), 2);
end;

function HexToString(s: string): string;
var
 i: integer;
begin
 result := "";
 for i := 1 to Length(s) div 2 do
   try result := result + chr(StrToInt("$" + copy(s, i*2-1, 2)));
   except result := result + "?"; end;
end;

function TPassSaver.HideStr(s: string): string;
var
 p:  PByte;
 sz: dword;
begin
 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);
end;

function TPassSaver.ShowStr(s: string): string;
var
 p:  PByte;
 sz: dword;
begin
 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);
 end else result := s;
 FreeMem(p);
end;

end.


Пример в файле. http://files.rsdn.ru/89537/Crypt.rar

Все в Delphi 7 работает правильно!
А вот в Delphi 2009 НЕПРАВИЛЬНО ШИФРУЕТ!!
ПОМОГТЕ ДОДЕЛАТЬ МОДУЛЬ Crypt ЧТОБЫ КОРЕКТНО РАБОТАЛ Delphi 2009 И Delphi 7, БУДУ ПРИМНОГО БЛАГОДАРЕН!!
(Как я понял мешают нововедения D2009 UNICODE)


 
Медвежонок Пятачок ©   (2009-10-14 09:15) [1]

на самом деле этот модуль и в д7 по настоящему ничего не шифрует.

после вызова вот этого :
CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
у тебя нет никакого реального контекста контейнера ключа (потому что использован флаг CRYPT_VERIFYCONTEXT)

А далее из этого контекста типа дерайвится ключик и на нем делается CryptEncrypt

В общем чем так обманывать себя, лучше просто взять ксор пароля на однобайтовом ключе.


 
fantasy   (2009-10-14 09:27) [2]

Медвежонок Пятачок © Ели можете доделайте библиотеку!


 
Медвежонок Пятачок ©   (2009-10-14 09:40) [3]

да просто замени стринг на ансистринг и все


 
fantasy   (2009-10-14 09:51) [4]

Мне нужны 2 функции
function CryptStr(s: string): string;
function DeCryptStr(s: string): string;
если у вас есть модуль поделитесь.
(Нужно чтобы коректно работал и в D7-D2009).
Поделитесь
Исползовать таково монстра как http://www.cityinthesky.co.uk/cryptography.html неочень хочется!


 
fantasy   (2009-10-14 10:10) [5]

Заменил все String на AnsiString всеравно неправильно!


 
Anatoly Podgoretsky ©   (2009-10-14 10:30) [6]

> fantasy  (14.10.2009 08:29:00)  [0]

В Д2009 строки Юникодовые


 
fantasy   (2009-10-14 10:34) [7]

КАК ПОСТУПИТЬ ?
МОДУЛЬ МОЖНО ПЕРЕДЕЛАТЬ?


 
DVM ©   (2009-10-14 10:49) [8]


> КАК ПОСТУПИТЬ ?

Самому попытаться разобраться как работает то, что ты пытаешься слепо использовать и переделать?


> МОДУЛЬ МОЖНО ПЕРЕДЕЛАТЬ?

Можно конечно, тем более, что функциям из advapi  по барабану что шифровать.


 
fantasy   (2009-10-14 10:55) [9]

DVM © сгласен. Я на изучение нововидений в delphi 2009 потачю месяц если не больше.
Я надеялся здесь есть люди которые переделают за 5 минут.


 
Медвежонок Пятачок ©   (2009-10-14 10:55) [10]

Выясни для начала что возвращает Length для юникода.
Количество символов или байтов.
Шифровать надо все количество байт, а не количество символов.


 
DVM ©   (2009-10-14 11:05) [11]


> fantasy   (14.10.09 10:55) [9]


> Я на изучение нововидений в delphi 2009 потачю месяц если
> не больше.

Тебе не нужны все нововведения. Тебе нужно уяснить одно. Функции шифрования приведенные выше работают с байтами. Раньше до D2009 1 символ занимал 1 байт, теперь один символ занимает SizeOf(Char).


 
brother ©   (2009-10-14 11:06) [12]

> [7] fantasy   (14.10.09 10:34)
> КАК ПОСТУПИТЬ ?
> МОДУЛЬ МОЖНО ПЕРЕДЕЛАТЬ?

и не надо на нас капс поднимать!


 
Anatoly Podgoretsky ©   (2009-10-14 11:07) [13]


> Я надеялся здесь есть люди которые переделают за 5 минут.

Это твоя оценка, ну за 5 минут никто и шевелиться не будет.


 
fantasy   (2009-10-15 03:55) [14]

Удалено модератором
Примечание: Обсуждение модерирования


 
Германн ©   (2009-10-15 04:13) [15]


> fantasy   (15.10.09 03:55) [14]

Крикунов - на мороз! (так моя мама говорила :)



Страницы: 1 вся ветка

Текущий архив: 2009.11.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.012 c
15-1254404923
Drowsy
2009-10-01 17:48
2009.11.29
Изменение файла..


1-1226938293
burbuluc
2008-11-17 19:11
2009.11.29
Как выйти из ступора?


3-1230112330
tomkat
2008-12-24 12:52
2009.11.29
Отчет FRP в записать таблицу ?


15-1249471484
pasha_golub
2009-08-05 15:24
2009.11.29
Игрушки


2-1255072442
novai
2009-10-09 11:14
2009.11.29
Работа с указателями