![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Шифрование строки. [D7, WinXP]
fantasy © (2009-10-14 08:29:00)Вот нашол в инете модуль
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-15 04:13:00) [1]
> fantasy (15.10.09 03:55) [14]
Крикунов - на мороз! (так моя мама говорила :)
fantasy (2009-10-15 03:55:00) [2]Удалено модератором
Примечание: Обсуждение модерирования
Anatoly Podgoretsky (2009-10-14 11:07:00) [3]
> Я надеялся здесь есть люди которые переделают за 5 минут.
Это твоя оценка, ну за 5 минут никто и шевелиться не будет.
brother (2009-10-14 11:06:00) [4]> [7] fantasy (14.10.09 10:34)
> КАК ПОСТУПИТЬ ?
> МОДУЛЬ МОЖНО ПЕРЕДЕЛАТЬ?
и не надо на нас капс поднимать!
DVM (2009-10-14 11:05:00) [5]
> fantasy (14.10.09 10:55) [9]
> Я на изучение нововидений в delphi 2009 потачю месяц если
> не больше.
Тебе не нужны все нововведения. Тебе нужно уяснить одно. Функции шифрования приведенные выше работают с байтами. Раньше до D2009 1 символ занимал 1 байт, теперь один символ занимает SizeOf(Char).
fantasy (2009-10-14 10:55:00) [6]DVM © сгласен. Я на изучение нововидений в delphi 2009 потачю месяц если не больше.
Я надеялся здесь есть люди которые переделают за 5 минут.
Медвежонок Пятачок (2009-10-14 10:55:00) [7]Выясни для начала что возвращает Length для юникода.
Количество символов или байтов.
Шифровать надо все количество байт, а не количество символов.
DVM (2009-10-14 10:49:00) [8]
> КАК ПОСТУПИТЬ ?
Самому попытаться разобраться как работает то, что ты пытаешься слепо использовать и переделать?
> МОДУЛЬ МОЖНО ПЕРЕДЕЛАТЬ?
Можно конечно, тем более, что функциям из advapi по барабану что шифровать.
fantasy (2009-10-14 10:34:00) [9]КАК ПОСТУПИТЬ ?
МОДУЛЬ МОЖНО ПЕРЕДЕЛАТЬ?
Anatoly Podgoretsky (2009-10-14 10:30:00) [10]> fantasy (14.10.2009 08:29:00) [0]
В Д2009 строки Юникодовые
fantasy (2009-10-14 10:10:00) [11]Заменил все String на AnsiString всеравно неправильно!
fantasy (2009-10-14 09:51:00) [12]Мне нужны 2 функции
function CryptStr(s: string): string;
function DeCryptStr(s: string): string;
если у вас есть модуль поделитесь.
(Нужно чтобы коректно работал и в D7-D2009).
Поделитесь
Исползовать таково монстра как http://www.cityinthesky.co.uk/cryptography.htmlнеочень хочется!
Медвежонок Пятачок (2009-10-14 09:40:00) [13]да просто замени стринг на ансистринг и все
fantasy (2009-10-14 09:27:00) [14]Медвежонок Пятачок © Ели можете доделайте библиотеку!
Медвежонок Пятачок (2009-10-14 09:15:00) [15]на самом деле этот модуль и в д7 по настоящему ничего не шифрует.
после вызова вот этого :
CryptAcquireContext(@hProv, nil, nil, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT);
у тебя нет никакого реального контекста контейнера ключа (потому что использован флаг CRYPT_VERIFYCONTEXT)
А далее из этого контекста типа дерайвится ключик и на нем делается CryptEncrypt
В общем чем так обманывать себя, лучше просто взять ксор пароля на однобайтовом ключе.