Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Excerpt

There are lots of way can encrypt a text string based on a key. By the approach, you can use a single numerical key, or text string. In terms of security's point of view, text string-based key has better security performance.

Below example shows the method encrypting a text string based on a numerical keycode is an example of string encryption module.

Code Block
languagedelphi
function Encrypt(const CKEY1 = 53761;
      CKEY2 = 32618;

function EncryptStr(const S :WideString; Key: string): String;
var
  i :integer;
  RStr :RawByteString;
  RStrB :TBytes Absolute RStr;
begin
  Result:= '';
  RStr:= UTF8Encode(S);
  InString:string; Salt:string): string;
var
  i : Byte;
  StartKey, MultKey, AddKey: Word;
begin
  Result := '';
  if (Salt = '') then begin
    Result := InString;
  end
  else begin
    StartKey := Length(Salt);
    MultKey := Ord(Salt[1]);
    AddKey := 0;
    for i := 1 to Length(Salt) - 1 do AddKey := AddKey + Ord(Salt[i]);
    for i := 01 to Length(RStrInString)-1 do
    begin
    RStrB[i]  Result := RStrB Result + CHAR(Byte(InString[i]) xor (KeyStartKey shr 8));
      KeyStartKey := (RStrBByte(Result[i]) + KeyStartKey) * CKEY1 + CKEY2;
  end;
  MultKey + AddKey;
    end;
  end;
end;

function Decrypt(const InString:string; Salt:string): string;
var
  i : Byte;
  StartKey, MultKey, AddKey: Word;
begin
  Result := '';
  if (Salt = '') then begin
    Result := InString;
  end
  else begin
    StartKey := Ord(Salt[1]);
    MultKey := Length(Salt);
    AddKey := 0;
    for i := 01 to Length(RStrSalt) - 1 do AddKey := AddKey + Ord(Salt[i]);
    for i := 1 to Length(InString) do
    begin
      Result := Result + IntToHex(RStrB[i], 2);
  end;
end CHAR(Byte(InString[i]) xor (StartKey shr 8));
      StartKey := (Byte(InString[i]) + StartKey) * MultKey + AddKey;
    end;
  end;
end;

By the way, above was not helpful for me - I use multibyte character, and below code was so helpful even though I can't use any key on the documentation

Code Block
uses IdCoder, IdCoderMIME, IdGlobal;

..
..

begin
    // encode string
    sMasterXML.Text := TIdEncoderMIME.EncodeString(sMasterXML.Text, IndyTextEncoding_UTF8);

	// deocde string
    sMasterXML.Text := TIdDecoderMIME.DecodeString(sMasterXML.Text, IndyTextEncoding_UTF8);

end;

Below is combined encryption algorithm which provides much better secure results.

Code Block
languagedelphi
uses IdCoder, IdCoderMIME, IdGlobal;

.
.
.


const CK_ENC_VAR_RANGE=10;

function DecryptStrCKEncrypt(const SSource: Stringstring; KeySalt: string): Stringstring;
var
  i, tmpKey :Integer;
  RStr :RawByteString lenSalt, key, keyWeight: Word;
  InString: string;
begin
  Result := '';
  RStrB :TBytes Absolute RStr;if (Salt = '') then begin
  tmpStr  Result :string= Source;
  end else begin
    InString tmpStr:= UpperCase(STIdEncoderMIME.EncodeString(Source, IndyTextEncoding_UTF8);

   SetLength(RStr, lenSalt := Length(tmpStr) div 2);
  i:= 1;
  trySalt);

    keyWeight := 0;
    for i := 1 to lenSalt do keyWeight := keyWeight + ord(Salt[i]);
    keyWeight := keyWeight mod CK_ENC_VAR_RANGE;

    whilefor (i <:= 1 to Length(tmpStrInString)) do
    begin
      RStrB[i div 2]:= StrToInt('$' + tmpStr[i] + tmpStr[i+1]key := ( ord(Salt[(i mod lenSalt) + 1]) mod CK_ENC_VAR_RANGE);
      Result := Result + CHAR(Byte(InString[i]) + key - keyWeight);
    end;
  Inc(i, 2);
    end;
  except
    Result:= '';
    Exit;
  end;
   end;
end;

function CKDecrypt(const InString:string; Salt:string): string;
var
  i, lenSalt, key, keyWeight: Word;
  Target: string;
begin
  if (Salt = '') then begin
    Target := InString;
  end else begin
    lenSalt := Length(Salt);

    keyWeight := 0;
    for i := 01 to Length(RStr)-1 do beginlenSalt do keyWeight := keyWeight + ord(Salt[i]);
    keyWeight := keyWeight mod CK_ENC_VAR_RANGE;

    Target tmpKey:= RStrB[i]'';
    RStrB[i]for i := 1 to Length(InString) do
    begin
      key := RStrB( ord(Salt[(i] xor (Key shr 8 mod lenSalt) + 1]) mod CK_ENC_VAR_RANGE);
    Key  Target := (tmpKeyTarget + KeyCHAR(Byte(InString[i]) *- CKEY1key + CKEY2keyWeight);
    end;
    Result := UTF8Decode(RStrTIdDecoderMIME.DecodeString(Target, IndyTextEncoding_UTF8);
end;

Example

Code Block
  end;
end;

{ Testng }
procedure TForm1.btn1ClickButton1Click(Sender: TObject);
begin
  txt2Memo2.Text := EncryptStrCKEncrypt(txt1Memo1.Text, 223'foo');
  lbl1Memo3.CaptionText := DecryptStrCKDecrypt(txt2Memo2.Text, 223'foo');
end;

...