Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2009.11.29;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
1-1226314117
lod
2008-11-10 13:48
2009.11.29
Ошибка


15-1254472377
@!!ex
2009-10-02 12:32
2009.11.29
Как работает Hamachi?


2-1255671085
IOrist
2009-10-16 09:31
2009.11.29
StringGrid


3-1230124390
interbase
2008-12-24 16:13
2009.11.29
без sp_executeSQL не обойтись?


15-1253465872
Кто б сомневался
2009-09-20 20:57
2009.11.29
Помогите перевести





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский