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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.07.2012, 12:26   #1
Mrsqler
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 146
По умолчанию Расшифровка пароля

Вот код
Код:
unit Unit2;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, IdCookieManager, IdBaseComponent, IdComponent, IdTCPConnection,
  IdTCPClient, IdHTTP, StdCtrls, sEdit, sCheckBox,inifiles;

type
  TForm2 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Button1: TButton;
    IdHTTP1: TIdHTTP;
    IdCookieManager1: TIdCookieManager;
    login: TsEdit;
    pass: TsEdit;
    Label3: TLabel;
    Label4: TLabel;
    sCheckBox1: TsCheckBox;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form2: TForm2;
  IniFile:TiniFile;

implementation

uses Unit1;

{$R *.dfm}
type
 ECryptError = class(Exception);
const
 csCryptFirst = 20;
 csCryptSecond = 230;
 csCryptHeader = '';

function CryptString(Str:String):String;
var i,clen : Integer;
begin
 clen := Length(csCryptHeader);
 SetLength(Result, Length(Str)+clen);
 Move(csCryptHeader[1], Result[1], clen);
 For i := 1 to Length(Str) do
  begin
   if i mod 2 = 0 then
    Result[i+clen] := Chr(Ord(Str[i]) xor csCryptFirst)
   else
    Result[i+clen] := Chr(Ord(Str[i]) xor csCryptSecond);
  end;
end;

function UnCryptString(Str:String):String;
var i, clen : Integer;
begin
 clen := Length(csCryptHeader);
 SetLength(Result, Length(Str)-clen);
 if Copy(Str, 1, clen) <> csCryptHeader then
  raise ECryptError.Create('UnCryptString failed');

 For i := 1 to Length(Str)-clen do
  begin
   if (i) mod 2 = 0 then
    Result[i] := Chr(Ord(Str[i+clen]) xor csCryptFirst)
   else
    Result[i] := Chr(Ord(Str[i+clen]) xor csCryptSecond);
  end;
end;



 //авторизация
procedure TForm2.Button1Click(Sender: TObject);
var
 PageProfile:string;
 begin
   if login.Text='' then messagebox(0,'Введите ваш E-mail','Vk_Messages',MB_OK or MB_ICONINFORMATION)
   else
      if pass.Text='' then messagebox(0,'Введите пароль!','Vk_Messages',MB_OK or MB_ICONINFORMATION)
      else
 begin
  TidCookieManager.Create(IdHTTP1);
   IdHTTP1.Request.Host:='http://vk.com';
   IdHTTP1.Request.UserAgent:='Mozila/5.0 (Windows; U; Windows NT 5.1; com; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
   IdHTTP1.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
   IdHTTP1.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
   IdHTTP1.Request.AcceptCharSet:='windows-1251,utf-8;q=0.7,*;q=0.7';
   IdHTTP1.AllowCookies:=true;
   IdHTTP1.HandleRedirects:=True;

try
  PageProfile:=IdHTTP1.get('http://vkontakte.ru/login.php?email='+login.Text+'&pass='+pass.Text)
except
end;

 if Pos ('logout', PageProfile)<>0 then
     begin
      messagebox(0,'Авторизация прошла успешно!','Vk_Messages',MB_OK or MB_ICONINFORMATION);
      label4.Caption:='Online';
      form2.Close;
     end
 else
 messagebox(0,'Авторизация не удалась!Попробуйте снова.','Vk_Messages|Ошибка!',MB_OK or MB_ICONERROR);
      // Cохраняем логин и пароль в файл config.ini (!Сохраняется только если авторизовались!)
if (sCheckBox1.Checked=True) and (Pos ('logout', PageProfile)<>0) Then
begin
IniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'config.ini');
IniFile.WriteString('User', 'Login',CryptString(login.text));
IniFile.WriteString('User', 'Pass',CryptString(pass.text));
     end
  end;
   end;

procedure TForm2.FormCreate(Sender: TObject);
begin
// Открывает config.ini и вставляем в поля Логин и Пароль данные, если они есть
IniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'config.ini');
login.Text:=UnCryptString(IniFile.ReadString('User', 'Login',('')) );
pass.Text:=UnCryptString(IniFile.ReadString('User', 'Pass','') );
end;

end.

При успешной авторизации создается файл config.ini вкотором хранятся логин и пароль юзера.Также есть функции которые шифруют пароль,и дешифруют.
Проблема в том,что пароль только шифруется,а вот обратно расшифровываться не хочет.В pass.text и login.Text поялвляюся каркули,а не нормальный пароль и логин.
Что не так?IniFile даже глобальной сделал
Mrsqler вне форума Ответить с цитированием
Старый 13.07.2012, 12:36   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

а зачем расшивровывать?

Берете md5 и ловите первый ввод пароля(отм. его по "сохранить пароль в программе"), и в дальнейшем просто сверяете хеши через CompareStr если совпадает, то пароль введён верно, иначе не верно. Расшифровка только увеличивает шанс получить пароль без граблей.
Человек_Борща вне форума Ответить с цитированием
Старый 13.07.2012, 12:42   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

судя по Vk_Messages ТС всетаки нужен пароль.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.07.2012, 14:06   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию пример xor шифрования с записью в INI файл

Код:
.....
var
  Form1: TForm1;

implementation
uses IniFiles;

{$R *.dfm}
const
  KeyPass = #09'8'#04'AZ@'#27; {Это ключ для шифрования.
     Он может быть любой. Главное, чтобы он был подлинее и послучайнее...}

function StringCoder(const s : AnsiString) : AnsiString;
var k, i : integer;
  key, sResult  : AnsiString;
begin
  key := KeyPass;
  sResult := s;
  k := 1;
  for i := 1 to Length(s) do
    begin
      sResult[i] := AnsiChar((ord(sResult[i]) XOR ord(key[k])));
      inc(k);
      if (k>length(key)) then k := 1;
    end;
  StringCoder := sResult
end;

function StringToBytes(const s : AnsiString) : AnsiString;
var i:integer;
begin
  Result := '';
  for i := 1 to Length(s) do
    Result := Result + IntToHex(ord(s[i]),2);
end;

function BytesToString(const s : AnsiString) : AnsiString;
var i, k : integer;
 sOne : string[3];
 OneCode : Integer;
begin
  Result := '';
  i := 1;
  while i<=Length(s) do begin
    sOne := '$'+Copy(s,i,2);
    val(sOne, OneCode, k);
    if k<>0 then begin ShowMessage('Ошибка в закодированной строке!'); Exit end;
    Result := Result + AnsiChar(OneCode);
    inc(i,2);
  end;
end;

procedure TForm1.brReadClick(Sender: TObject);
var IniFile : TIniFile;
  s : string;
begin
  IniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'config.ini');
  s := IniFile.ReadString('User', 'Login', '');
  login.Text := StringCoder ( BytesToString(s) );
  s := IniFile.ReadString('User', 'Pass',  '');
  pass.Text := StringCoder ( BytesToString(s) );
  FreeAndNil(IniFile);
end;

procedure TForm1.btWriteClick(Sender: TObject);
var IniFile : TIniFile;
begin
  IniFile:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'config.ini');
  IniFile.WriteString('User', 'Login', StringToBytes( StringCoder(login.text)));
  IniFile.WriteString('User', 'Pass',  StringToBytes( StringCoder(pass.text)));
  FreeAndNil(IniFile);
end;

end.
Вложения
Тип файла: rar XorCryptExample_sources.rar (1.5 Кб, 187 просмотров)
Тип файла: rar XorCryptExample_exe.rar (180.0 Кб, 148 просмотров)
Serge_Bliznykov вне форума Ответить с цитированием
Старый 13.07.2012, 15:26   #5
Mrsqler
Форумчанин
 
Регистрация: 13.02.2012
Сообщений: 146
По умолчанию

Спасибо большое Serge_Bliznykov.Всё работает)Поставил +
Теперь такой вопрос: имеет ли смысл вообще шифровать логин и пароль,если в программе открытой исходный код?Т.е она бесплатная,и исходник я тоже ни от кого не скрываю.
Mrsqler вне форума Ответить с цитированием
Старый 13.07.2012, 15:42   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

это, вам виднее - смотря что за программа, для чего в ней пароль и т.д. и т.п.

Но, на мой взгляд, ОБЯЗАТЕЛЬНО стоит шифровать.
А вот каким образом хранить ключ - это вопрос. Разумеется, ключик должен быть на каждом компьютере свой (его либо пользователь при первом запуске должен задавать, либо генерировать в самой программе при первом запуске - это уже второстепенные детали). Но по поводу xor-шифрования - легко зашифровать/расшифровать вам - легко злоумышленнику получить расшифрованный пароль (при доступе к компьютеру жерты, конечно). Опасно это или нет - смотрите сами. С другой стороны — множество паролей, сохраненных известными программами на компьютере (в т.ч. пароли в браузераз IE, Opera, Mozilla) прекрасно расшифровываются соответствующими программами.

Если мне позволительно будет провести аллегорию.
То, пароль, хранимый в открытом виде - это ключик от двери, лежаший на виду, прямо рядом с закрытой дверью. Пароль зашифрованный (который расшифровывает программа), это тоже ключик, лежаший рядом с дверью, но уже не на виду, а спрятанный где-то под половичок или под камушек... Его тоже можно легко найти, но уже прийдётся чуть-чуть напрячься...
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
онлайн расшифровка lezgin Общие вопросы Delphi 0 01.02.2012 14:57
расшифровка хэша Arinka Безопасность, Шифрование 8 02.03.2011 08:44
Расшифровка пароля из базыданных PHPBB3 Яр|/||< (^_^) WordPress и другие CMS 2 05.08.2010 11:51
расшифровка md5 denisov PHP 5 15.04.2010 18:12