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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2010, 04:38   #1
newerdie
 
Регистрация: 04.02.2010
Сообщений: 1
Печаль Трудный отрезок в тексте программы

В своей программе созданной для работы с паролями я использовал метод шифрования с закрытым ключём алгоритмом RC2 взятым из интернета. Не могу разобраться в самом процессе шифрования, как генерируется ключ (если он вообще генерируется) и где потом хранится.

Код:
unit MiniCry;
 
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 = 'WrSxnCNBpJ7Ko4[e",7Ty)a0ykP)62Ce[.bAA;SuOf4*{nagx4s,;5!eHU!v=p3z';
 
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 := chr(Ord('0') + b)
    else Result := chr(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 + chr(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.
Заранее спасибо.

Последний раз редактировалось Stilet; 17.05.2010 в 07:25.
newerdie вне форума Ответить с цитированием
Старый 17.05.2010, 08:48   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,833
По умолчанию

Код:
я использовал метод шифрования с закрытым ключём алгоритмом RC2
А в коде куча RC4?..

Цитата:
как генерируется ключ (если он вообще генерируется) и где потом хранится.
Т.е. названия параметров и функции смотреть нельзя?
Код:
pass: string;
Код:
CryptDeriveKey(hProv, alg, hash, 0, @hSKey);
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Трудный отрезок в тексте программы Грехоносец Помощь студентам 2 17.05.2010 03:17
Ошибка в тексте программы Pascal daniil2010 Помощь студентам 3 06.05.2010 00:58
как запустить другой exe из в тексте программы ? somwan Общие вопросы C/C++ 5 01.10.2009 14:28
Ошибка в тексте программы с пользовательским модулем zonclayv Паскаль, Turbo Pascal, PascalABC.NET 1 22.12.2008 21:39
перевести не трудный код программы из Delphi на С++ Ilius Помощь студентам 2 16.12.2008 18:11