//---------------------------------------------------------------------------
const char HexaChar[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
//---------------------------------------------------------------------------
AnsiString __fastcall ValueToHex(AnsiString Value)
{
AnsiString FResult = "";
FResult.SetLength(Value.Length() * 2);
for (int I = 0; I < Value.Length(); I++)
{
FResult[(I * 2) + 1] = HexaChar[int(Value[I + 1]) >> 4];
FResult[(I * 2) + 2] = HexaChar[int(Value[I + 1]) & 0x0F];
}
return FResult;
}
//---------------------------------------------------------------------------
AnsiString __fastcall HexToValue(AnsiString Hex)
{
AnsiString SResult = "";
SResult.SetLength((Hex.Length() / 2));
for (int I = 0; I < (Hex.Length() / 2); I++)
{
SResult[I + 1] = char(StrToInt("0x" + Hex.SubString((I * 2) + 1, 2)));
}
return SResult;
}
//---------------------------------------------------------------------------
AnsiString __stdcall Encrypt(AnsiString Value, Word Key)
{
AnsiString SResult = "";
SResult.SetLength(Value.Length());
for (int I = 1; I < Value.Length() + 1; I++)
{
SResult[I] = char(byte(Value[I]) ^ (Key >> 8));
}
return ValueToHex(SResult);
}
//---------------------------------------------------------------------------
AnsiString __stdcall Decrypt(AnsiString Value, Word Key)
{
AnsiString SValue = "";
AnsiString SResult = "";
SValue = HexToValue(Value);
SResult.SetLength(SValue.Length());
for (int I = 1; I < SValue.Length() + 1; I++)
{
SResult[I] = char(byte(SValue[I]) ^ (Key >> 8));
}
return SResult;
}
//---------------------------------------------------------------------------
TIniFile *UserInfoIni = new TIniFile("UserInfo.INI");
ReadPassStr = UserInfoIni->ReadString("USER PASS", "AA", "");
SelectUserPass = Decrypt(ReadPassStr, 1234); 복원 -> Key값 1234 는 아무값이나 넣어주시면 됩니다.
UserInfoIni->WriteString("USER PASS", "AAA", Encrypt("암호", 1234));
Decrypt, Encrypt 함수에서 Key 값은 동일해야 합니다.
위 소스는 제가 쓰고 있는 소스 입니다.
임윤관 님이 쓰신 글 :
: 안녕하세요. 업무일지 프로그램을 수정하고 있습니다.
:
: 처음에 로그인할때 id, 비밀번호를 입력한것을 "ID저장"이라는 체크박스를 눌렀을때 (CheckBox1->Checked==true사용)
:
: ini파일로 저장을하고, "ID저장"이라는 체크박스를 누르지 않았을때는 ( CheckBox1->Checked!=true사용)
:
: ini파일로 공백으로 id,비밀번호가 저장되서
: ("Settings", "Id", FrmLogin->editId->Text), ("Settings", "Pw", FrmLogin->editPassword->Text) 사용
:
: 이후 로그인할때 체크박스를 누르면 그 전에 체크박스를 누른체로 로그인 했을경우
: 그때 로그인한 ID,비밀번호가 불러와집니다.
:
: 생각을해보니 체크박스를 눌러서 id,비밀번호가 저장이 되면 ini파일을 열었을때 id,비밀번호가 고스란히 노출이 되는 문제가 있습니다.
: 처음 Writestring으로 보낼때 암호화해서 ini보내지고 Readstring 했을때 복호화해서 로그인정보를 불러올수 있을까요?...
:
: 인터넷에서 검색해서 여러가지 예제를 대입해봤는데 되지가 않네요 ㅠㅠ
: 아래는 Readstring, Writestring을 사용한 소스 일부입니다.
:
:
:
: //==========================================================================
: if(CheckBox1->Checked)
: {
: ini->WriteString("Settings", "Id", FrmLogin->editId->Text); //////
: ini->WriteString("Settings", "Pw", FrmLogin->editPassword->Text);
: }
: //==========================================================================
: if(CheckBox1->Checked==true)
: {
: FrmLogin->editId->Text = ini->ReadString("Settings", "Id", FrmLogin->editId->Text);
: FrmLogin->editPassword->Text = ini->ReadString("Settings", "Pw", FrmLogin->editPassword->Text);
: }
: //==========================================================================
: if(CheckBox1->Checked!=true)
: {
: String path = ExtractFilePath( Application->ExeName )+"Ipinfo.ini"; //2020
: TIniFile *ini = new TIniFile( path );
: ini->WriteString("Settings", "Id", "");
: ini->WriteString("Settings", "Pw", "");
: }
: //==========================================================================
: FrmLogin->editId->Text = ini->ReadString("Settings", "Id", FrmLogin->editId->Text);
: FrmLogin->editPassword->Text = ini->ReadString("Settings", "Pw", FrmLogin->editPassword->Text);
:
: //==========================================================================