| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- //---------------------------------------------------------------------------
- #include <vcl.h>
- #pragma hdrstop
- #include "Security.h"
- //---------------------------------------------------------------------------
- #pragma package(smart_init)
- //---------------------------------------------------------------------------
- AnsiString SimpleEncryptChar(unsigned char Ch)
- {
- Ch = (unsigned char)((~Ch) ^ PWALG_SIMPLE_MAGIC);
- return
- PWALG_SIMPLE_STRING.SubString(((Ch & 0xF0) >> 4) + 1, 1) +
- PWALG_SIMPLE_STRING.SubString(((Ch & 0x0F) >> 0) + 1, 1);
- }
- //---------------------------------------------------------------------------
- unsigned char SimpleDecryptNextChar(AnsiString &Str)
- {
- if (Str.Length() > 0)
- {
- unsigned char Result = (unsigned char)
- ~((((PWALG_SIMPLE_STRING.Pos(Str.c_str()[0])-1) << 4) +
- ((PWALG_SIMPLE_STRING.Pos(Str.c_str()[1])-1) << 0)) ^ PWALG_SIMPLE_MAGIC);
- Str.Delete(1, 2);
- return Result;
- }
- else return 0x00;
- }
- //---------------------------------------------------------------------------
- AnsiString EncryptPassword(AnsiString Password, AnsiString Key, Integer /* Algorithm */)
- {
- AnsiString Result("");
- int Shift, Index;
- if (!RandSeed) Randomize();
- Password = Key + Password;
- Shift = (Password.Length() < PWALG_SIMPLE_MAXLEN) ?
- (unsigned char)random(PWALG_SIMPLE_MAXLEN - Password.Length()) : 0;
- Result += SimpleEncryptChar((Char)PWALG_SIMPLE_FLAG); // Flag
- Result += SimpleEncryptChar((Char)0); // Dummy
- Result += SimpleEncryptChar((Char)Password.Length());
- Result += SimpleEncryptChar((Char)Shift);
- for (Index = 0; Index < Shift; Index++)
- Result += SimpleEncryptChar((unsigned char)random(256));
- for (Index = 0; Index < Password.Length(); Index++)
- Result += SimpleEncryptChar(Password.c_str()[Index]);
- while (Result.Length() < PWALG_SIMPLE_MAXLEN * 2)
- Result += SimpleEncryptChar((unsigned char)random(256));
- return Result;
- }
- //---------------------------------------------------------------------------
- AnsiString DecryptPassword(AnsiString Password, AnsiString Key, Integer /* Algorithm */)
- {
- AnsiString Result("");
- Integer Index;
- unsigned char Length, Flag;
- Flag = SimpleDecryptNextChar(Password);
- if (Flag == PWALG_SIMPLE_FLAG)
- {
- /* Dummy = */ SimpleDecryptNextChar(Password);
- Length = SimpleDecryptNextChar(Password);
- }
- else Length = Flag;
- Password.Delete(1, ((Integer)SimpleDecryptNextChar(Password))*2);
- for (Index = 0; Index < Length; Index++)
- Result += (char)SimpleDecryptNextChar(Password);
- if (Flag == PWALG_SIMPLE_FLAG)
- {
- if (Result.SubString(1, Key.Length()) != Key) Result = "";
- else Result.Delete(1, Key.Length());
- }
- return Result;
- }
- //---------------------------------------------------------------------------
|