Forum > Beginners

<solved>Easy encryption of text files... Code added 16052024

(1/8) > >>

Sprek Skik:
I Have made a Notebook program. It makes Txt files. But it would be nice to make some sort of encryption. It gives more privacy in my opinion. I have been looking for it sometime, but my attempt to install encrypt has failed. Can someone give me a suggestion?

Added Some Code 16052024

I Made the following Code:

procedure TfrmNoteBewerker.EncryptMemo;
var
  i: integer;
  Cipher: TDCP_rc4;
begin
  CheckEncoding;
  Cipher:= TDCP_rc4.Create(Self);
  Cipher.InitStr(KeyStr,TDCP_sha1);         // initialize the cipher with a hash of the passphrase
  for i:= 0 to Memo1.Lines.Count-1 do       // decrypt the contents of the memo
    begin
      if Memo1.Lines <> '' then
        Memo1.Lines:= Cipher.EncryptString(Memo1.Lines);
    end;
    Cipher.Burn;
    Cipher.Free;

end;
       

De code is not really working as expected. So on advice from Gemini I made a procedure Check Unicode but it can not compile:

procedure TfrmNoteBewerker.CheckEncoding;
var
  MemoEncoding, KeyStrEncoding: TEncoding;
begin
  {
  // Check Memo1 encoding
  MemoEncoding := Memo1.Lines.Strings[0].Encoding; // Get encoding of the first line

  // Check KeyStr encoding (assuming it's a string variable)
  KeyStrEncoding := KeyStr.Encoding;

  if MemoEncoding <> KeyStrEncoding then
  begin
    // Encodings are different, handle the conversion
    WriteLn('Warning: Memo and KeyStr encodings differ!');
    // Choose a common encoding (e.g., UTF-8)
    TargetEncoding := TEncoding.UTF8;
    Memo1.Lines.Strings[0].Encoding := TargetEncoding; // Convert first line encoding
    KeyStr := TargetEncoding.GetString(KeyStr); // Convert KeyStr encoding
  end;
  }
end;

Handoko:
You can use DCPcrypt:
https://wiki.freepascal.org/DCPcrypt

Or maybe write your own, try this:
https://forum.lazarus.freepascal.org/index.php/topic,33013.msg213188.html#msg213188

KodeZwerg:

--- Quote from: Sprek Skik on May 14, 2024, 08:28:01 am ---my attempt to install encrypt has failed
--- End quote ---
I am unsure what that means but use what Lazarus brings at installation, compression! Its a different kind of encryption with advantage to be smaller than the input was, but that depend on input.
Next mostest easiest "encryption" = Base-Encoded, that format is often used in telecommunication to transfer binary files to ascii-encrypted.
You can also combine one with another, or simply open a browser, there are many basics about encryption explained via wiki.

Thaddy:
Oh, well,

Having some fun with randoms looks always good to me:
This code makes use of the predictability and repeatability of a PseudoRandom Number Generator. Actually any PRNG, but you do not want to ruin the system.randseed, so I use a separate random. Principle is the same:
--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---program cryptrandom;{$mode objfpc}{$modeswitch typehelpers}{$H+}{ This is demo that you can actually use random to encrypt/decrypt.  This is due to the nature of a Pseudo Random Number Generator,  where given a certain random seed, the sequence is predictable.  Here I use the Random Seed as a key to encrypt/decrypt a string.  The same code would also work with the Default random from FreePascal,  but it is better not to touch system.randseed, So I used a different  Random.    Have fun, Thaddy}uses { The unit is based on my  https://wiki.freepascal.org/Delphi_compatible_LCG_Random  but I adapted it, so will add it below}lcg_random2;   function Crypt(const value:AnsiString;const Key:Cardinal):AnsiString;var  i:integer;begin  RandSd := Key;  SetLength(Result,Length(Value));  for i := 1 to length(Value) do    Result[i] := Chr(Ord(Value[i]) xor lcgrandom(255));end; var  a:AnsiString;begin a:='This is the text to encrypt/decrypt.'; writeln(a); writeln('Encrypting..'); a:=Crypt(a, 12345); writeln(a); writeln('Decrypting..'); a:=Crypt(a, 12345);  writeln(a);end.Of course this is not hack safe, but:
- You have to know the Random generator that is used
- You have to know the Key. The Key is a numeric value in the range of cardinal.
- It is way better than XOR!
- It is also much simpler than XOR!, although it uses XOR the key is derived from the randseed.

Have fun!

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---// adapted version of my wiki entry with RandSeed factored outunit lcg_random2;// Delphi compatible LCG random number generator routines for Freepascal.// (c)2017, Thaddy de Koning. Use as you like// Algorithm, Delphi multiplier and increment taken from:// https://en.wikipedia.org/wiki/Linear_congruential_generator// The default Delphi RandomSeed is determined as zero.{$ifdef fpc}{$mode objfpc}{$endif}{$J+} interfaceconst   RandSd:cardinal = 0;   function LCGRandom: extended; overload;inline;function LCGRandom(const range:longint):longint;overload;inline; implementation function IM:cardinal;inline;begin  RandSd := RandSd * 134775813  + 1;  Result := RandSd;end; function LCGRandom: extended; overload;inline;begin  Result := IM * 2.32830643653870e-10;end; function LCGRandom(const range:longint):longint;overload;inline;begin  Result := IM * range shr 32;end; end.
[edit]
I added this code to the wiki too, since I think it is a good example for PRNG behavior.


Thaddy:
Technical detail:
Periodicity for this particular random encryption is 2^32 and is not vulnarable to frequency analysis, unlike xor.

Frequency analysis is also fun. Will write a simple example for that too:
Basically any natural language has a bias to certain characters. If you know that bias you can easily calculate the mean and the standard deviation to determine the likelyhood what a certain encrypted character actually is most likely. This works pretty good! And simple to do.

You can make it pretty much unbreakable with cycles:

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---function Crypt(const value:AnsiString;const Key:Cardinal;cycles:integer = 100):AnsiString;var  c,i:integer;begin  RandSd := Key;  SetLength(Result,Length(Value));  for c:= 1 to cycles do  begin    for i := 1 to length(Value) do    Result[i] := Chr(Ord(Value[i]) xor lcgrandom(255));  end;end;
I just love PRNG's, as most people know.
[edit] chatGPT is working on the above, but as yet no result for weakness....


Navigation

[0] Message Index

[#] Next page

Go to full version