...
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 | ||
---|---|---|
| ||
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 | ||
---|---|---|
| ||
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; |
...