::: 델파이 Tip&Trick :::

델파이 Tip&Trick 성격에 맞지 않는 광고,비방,질문의 글은 즉시 삭제하며
내용을 복사하여 사용할 경우 반드시 이곳(http://www.howto.pe.kr)을 출처로 명시하여 주세요


Category

  김영대(2003-03-06 20:57:36, Hit : 6236, Vote : 1461
 http://www.howto.pe.kr
 문자열의 암호화(Password 처리) & INI 파일

문자열을 암호로 만들고 이를 환경파일인 INI파일에 저장한 후 나중에
불러오는 경우가 있을겁니다
암호안에 ASCII 제어문자가 포함되어 있다면(CR/LF 등등)
텍스트 파일인 INI파일에 이를 저장하면 정확하지 않은 암호가
될 수 있습니다(잘 알려진 Leap FTP 가 그렇더군요)
그래서 암호를 다시 ASCII 숫자로 변환하여 처리하는 루틴을
포함했습니다


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Buttons, StdCtrls, IniFiles;

type
TForm1 = class(TForm)
   E_Name: TEdit;
   E_Age: TEdit;
   E_Password: TEdit;
   CB_Married: TCheckBox;
   SB_SaveINI: TSpeedButton;
   SB_LoadINI: TSpeedButton;
   procedure SB_SaveINIClick(Sender: TObject);
   procedure SB_LoadINIClick(Sender: TObject);
private
   { Private declarations }
public
   { Public declarations }
   function Encrypt(const S: String; Key: Word): String;
   function Decrypt(const S: String; Key: Word): String;
end;

const
C1 = 52845;     // 기준키1
C2 = 22719;     // 기준키2
MY_KEY = 12345; // 사용자키

var
Form1: TForm1;

implementation
{$R *.DFM}

function TForm1.Encrypt(const S: String; Key: Word): String;
var
i: Integer;
sEncrypt, rEncrypt: String;
rChar: Char;
begin
sEncrypt := ''; // 암호화된 이진 문자열
if S = '' then
begin
   Encrypt := '';
   System.Exit;
end;

for i := 1 to Length(S) do
begin
   sEncrypt := sEncrypt + char(byte(S[i]) xor (Key shr 8));
   Key := (byte(sEncrypt[i]) + Key) * C1 + C2;
end;

rEncrypt := ''; // 암호화된 이진 문자열을 ASCII 숫자로 변경
for i := 1 to Length(sEncrypt) do
begin
   rChar := sEncrypt[i];
   rEncrypt := rEncrypt + format('%.3d', [Ord(rChar)]); // 한문자당 3자리씩
end;
Result := rEncrypt;
end;

function TForm1.Decrypt(const S: String; Key: Word): String;
var
i: Integer;
sDecrypt, rDecrypt, temp: String;
begin
rDecrypt := '';
if S = '' then
begin
   Decrypt := '';
   System.Exit;
end;

i := 1;
repeat
   temp := Copy(S, i, 3); // 한문자당 3자리 숫자로 저장되어 있다
   rDecrypt := rDecrypt + Chr(StrToIntDef(temp, 0)); // ASCII값을 구한다
   i := i + 3;
until i > Length(S);

sDecrypt := '';
for i := 1 to Length(rDecrypt) do
begin
   sDecrypt := sDecrypt + char(byte(rDecrypt[i]) xor (Key shr 8));
   Key := (byte(rDecrypt[i]) + Key) * C1 + C2;
end;
Result := sDecrypt;
end;

// 환경파일에 저장
procedure TForm1.SB_SaveINIClick(Sender: TObject);
var
IniFile: TIniFile;
begin
IniFile := TIniFile.Create('TEST.INI');
try
   IniFile.WriteString('PERSON', '이름',    E_Name.Text);
   IniFile.WriteInteger('PERSON', '나이',   StrToIntDef(E_Age.Text,0));
   IniFile.WriteBool('PERSON', '결혼여부',  CB_Married.Checked);
   IniFile.WriteString('PERSON', '비밀번호',Encrypt(E_Password.Text, MY_KEY));
finally
   IniFile.Free;
end;
end;

// 환경파일에서 불러오기
procedure TForm1.SB_LoadINIClick(Sender: TObject);
var
IniFile: TIniFile;
begin
IniFile := TIniFile.Create('TEST.INI');
try
   E_Name.Text := IniFile.ReadString('PERSON', '이름', '');
   E_Age.Text  := IntToStr(IniFile.ReadInteger('PERSON', '나이', 0));
   CB_Married.Checked := IniFile.ReadBool('PERSON', '결혼여부', False);
   E_Password.Text := Decrypt(IniFile.ReadString('PERSON', '비밀번호', ''), MY_KEY);
finally
   IniFile.Free;
end;
end;

end.






691   [일반/컴포넌트] ListView 의 컬럼별로 Sort (내림차순 포함)  김영대 2003/03/05 5134 1097
690   [일반/컴포넌트] 명령행 인자 받아오기  김영대 2003/03/05 7182 1882
689   [네트웍/인터넷] List of raw FTP commands  김영대 2003/03/05 7227 1894
688   [네트웍/인터넷] RFC: Request for Comments  김영대 2003/03/05 7747 2039
687   [네트웍/인터넷] 윈도우즈 소켓의 에러번호에 대한 설명  김영대 2003/03/05 7800 2700
686   [일반/컴포넌트] 파일의 해부  김영대 2003/03/05 6338 1693
685   [일반/컴포넌트] ListBox의 스크롤바를 움직여보자  김영대 2003/03/05 4471 1092
684   [일반/컴포넌트] PopupMenu의 특정 MenuItem으로 이동하기  김영대 2003/03/05 2887 778
683   [일반/컴포넌트] 데스크탑의 아이콘을 몽땅 움직여보자!!  김영대 2003/03/05 6389 1897
682   [일반/컴포넌트] 마우스커서를 특정위치로 이동시키기  김영대 2003/03/05 5753 1210
681   [일반/컴포넌트] 제어판의 applet 띄우기  김영대 2003/03/05 2834 759
680   [일반/컴포넌트] INI 파일이 저장을 안 해?  김영대 2003/03/05 4054 1083
679   [일반/컴포넌트] 마우스영역 제어하기  김영대 2003/03/05 3597 978
678   [일반/컴포넌트] 리스트뷰에서 동적으로 칼럼삭제하기  김영대 2003/03/05 5221 1405
677   [일반/컴포넌트] Interesting Delphi Keystrokes !  김영대 2003/03/05 3591 1063
676   [일반/컴포넌트] Application 수준에서 한글/영문 제한두기  김영대 2003/03/05 5980 1846
675   [데이터베이스] dBASE Table File Extensions  김영대 2003/03/05 4567 1296
674   [데이터베이스] Paradox Table File Extensions  김영대 2003/03/05 3638 1022
673   [일반/컴포넌트] 파일의 속성(Attribute) 읽기 / 바꾸기  김영대 2003/03/05 4027 1048
672   [데이터베이스] DBGrid 에서 수직 Scroll Bar 감추기  김영대 2003/03/05 4619 1263
671   [윈도우즈 API] 인터넷 링크 만들기  김영대 2003/03/06 4548 1271
670   [네트웍/인터넷] 내 PC의 IP주소는 ?  김영대 2003/03/06 5266 1229
  [일반/컴포넌트] 문자열의 암호화(Password 처리) & INI 파일  김영대 2003/03/06 6236 1461
668   [윈도우즈 API] 윈도우의 타이틀바를 없애보자!  김영대 2003/03/06 4439 1355
667   [윈도우즈 API] 클립보드의 내용을 TXT 파일에 담아보자!  김영대 2003/03/06 6300 1760
666   [시스템] 프로세서를 생성시켜보자!  김영대 2003/03/06 4543 1210
665   [일반/컴포넌트] 델파이의 Object Inspector 모방  김영대 2003/03/06 3567 824
664   [시스템] 시스템의 각종 정보  김영대 2003/03/06 7499 1306
663   [데이터베이스] DBGrid 특정 Cell에 색상넣기  김영대 2003/03/06 7620 1580
662   [데이터베이스] DBGrid 의 특정필드만 Highlighting 시키기  김영대 2003/03/06 4623 1140
661   [COM/OLE] How to register an OCX  김영대 2003/03/06 4981 1171
660   [윈도우즈 API] "Windows 정보" About 화면 사용하기  김영대 2003/03/06 6428 1985
659   [일반/컴포넌트] 문자열에 한글이 있는지 검사  김영대 2003/03/06 3836 980
658   [일반/컴포넌트] TColor값을 16진수 문자열로 바꾸기  김영대 2003/03/06 6120 1774
657   [일반/컴포넌트] 화면변경시 콤포넌트 위치와 크기를 조정  김영대 2003/03/06 4618 1128
656   [시스템] 마우스 포인터 속도 구하기  김영대 2003/03/06 5454 1714
655   [시스템] 마우스 포인터 속도 바꾸기  김영대 2003/03/06 4942 1251
654   [시스템] 마우스 자취(trails)의 갯수 조정하기  김영대 2003/03/06 5805 1838
653   [시스템] 마우스 두 번 누르기 속도 조정하기  김영대 2003/03/06 5869 1827
652   [데이터베이스] 설치된 BDE Language Drivers 구하기  김영대 2003/03/06 3413 825

[1][2][3][4][5][6][7] 8 [9][10]..[25] [다음 10개]
 

Copyright 1999-2022 Zeroboard / skin by zero