Advertisement
linkcharger

simple encryption program

Jun 2nd, 2014
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 11.29 KB | None | 0 0
  1. unit main;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  9.   ExtCtrls, Menus, ShellApi, windows, LCLType;
  10.  
  11. type
  12.  
  13.   { TLinCryptWindow }
  14.  
  15.   TLinCryptWindow = class(TForm)
  16.     Benc: TButton;
  17.     Bdec: TButton;
  18.     Bclip: TButton;
  19.     Label1: TLabel;
  20.     Label2: TLabel;
  21.     Label3: TLabel;
  22.     MainMenu: TMainMenu;
  23.     MHelp: TMenuItem;
  24.     Help: TMenuItem;
  25.     About: TMenuItem;
  26.     Tkey: TEdit;
  27.     Minput: TMemo;
  28.     Moutput: TMemo;
  29.     procedure AboutClick(Sender: TObject);
  30.     procedure BclipClick(Sender: TObject);
  31.     procedure BdecClick(Sender: TObject);
  32.     procedure BencClick(Sender: TObject);
  33.     procedure FormCreate(Sender: TObject);
  34.     procedure HelpClick(Sender: TObject);
  35.  
  36.   private
  37.     { private declarations }
  38.   public
  39.     { public declarations }
  40.   end;
  41.  
  42. var
  43.   LinCryptWindow: TLinCryptWindow;
  44.  
  45. implementation
  46.  
  47. {$R *.lfm}
  48.  
  49. { TLinCryptWindow }
  50.  
  51. //COLLECTION OF ALGORITHMS
  52.  
  53.  
  54. function caesar(inStr:string; keyStr:string; dec:boolean):string;
  55.   var //position in text, current Letter
  56.       posT,curLetter:integer;
  57.       //encode-decode switch, key integer variable
  58.       x,key:integer;
  59.  
  60.   begin
  61.     try
  62.     //setting length of result
  63.     setLength(result,length(inStr));
  64.     //initializing key variable
  65.     key := 0;
  66.     //generating key in the constant range of 0..25
  67.     for posT := 1 to Length(keyStr) do  key := (key + ord(keyStr[posT])) mod 26;
  68.  
  69.     //defining switch
  70.     if dec then x := -1 else x := 1;
  71.  
  72.     for posT := 1 to Length(inStr) do
  73.     begin
  74.  
  75.          //--capitalized letters--
  76.          if inStr[posT] in ['A'..'Z'] then
  77.          begin
  78.  
  79.          //normalizing by substracting 'A'-ASCII code from letter-ASCII code
  80.          curLetter := (ord(inStr[posT]) - ord('A'));
  81.          //shift and integration of switch
  82.          curLetter := (26 + curLetter + x * key) mod 26;
  83.          //denormalizing and translate ASCII into letter
  84.          result[posT] := chr(curLetter + ord('A'));
  85.  
  86.          //transfere everything else than letters as it is
  87.          end else result[posT] := inStr[posT];
  88.  
  89.  
  90.          //--uncapitalized letters--
  91.          if inStr[posT] in ['a'..'z'] then
  92.          begin
  93.          curLetter := (ord(inStr[posT]) - ord('a'));
  94.          curLetter := (52 + curLetter + x * key) mod 26;
  95.          result[posT] := chr(curLetter + ord('a'));
  96.          end else result[posT] := inStr[posT];
  97.     end;
  98.  
  99.     except
  100.        //catching exceptions and showing error message
  101.        on E : Exception do showMessage('An '+E.Classname+' error occured: '+E.Message);
  102.     end;
  103.   end;
  104.  
  105. function vigenere(inStr:string; keyStr:string; dec:boolean):string;
  106. var //position in text and position in key
  107.     posT, posK: integer;
  108.     //current letter from key word and current to encrypt/decrypt letter
  109.     curKeyLetter, curLetter:integer;
  110.     //encode-decode switch variable
  111.     x:integer;
  112.  
  113.   begin
  114.     try
  115.     //setting length of result
  116.     setLength(result, Length(inStr));
  117.     //initializing key variable
  118.     posK := 0;
  119.     //defining switch
  120.     if dec then x := -1 else x := 1;
  121.  
  122.     for posT := 1 to Length(inStr) do
  123.     begin
  124.          //--capitalized letters--
  125.          if inStr[posT] in ['A'..'Z'] then
  126.          begin
  127.          //repeated scanning of key for letter and normalizing
  128.          curKeyLetter :=  ord(keyStr[1 + (posK mod Length(keyStr))]) - ord('A');
  129.          //normalizing by substracting 'A'-ASCII code from letter-ASCII code
  130.          curLetter := (ord(inStr[posT]) - ord('A'));
  131.          //shift, integration of switch and denormalizing
  132.          result[posT] := chr(((26 + curLetter + x * curKeyLetter) mod 26) + ord('A'));
  133.          //increasing position in key
  134.          inc(posK);
  135.  
  136.          //transfere everything else than letters as it is
  137.          end else result[posT] := inStr[posT];
  138.  
  139.  
  140.          //--uncapitalized letters--
  141.          if inStr[posT] in ['a'..'z'] then
  142.          begin
  143.          curKeyLetter :=  ord(keyStr[1 + (posK mod Length(keyStr))]) - ord('a');
  144.          curLetter := (ord(inStr[posT]) - ord('a'));
  145.  
  146.          result[posT] := chr(((52 + curLetter + x * curKeyLetter) mod 26) + ord('a'));
  147.          inc(posK);
  148.          end else result[posT] := inStr[posT];
  149.     end;
  150.  
  151.  
  152.     except
  153.        //catching exceptions and showing error message
  154.        on E : Exception do showMessage('An '+E.Classname+' error occured: '+E.Message);
  155.     end;
  156. end;
  157.  
  158. function pseudoRand(inStr:string; keyStr:string; dec:boolean):string;
  159.   var //position in text, current letter variable
  160.       posT,curLetter:integer;
  161.       //encode-decode switch and seed integer variable
  162.       x,seed:integer;
  163.  
  164.   begin
  165.     try
  166.     //setting length of result
  167.     setLength(result,length(inStr));
  168.     //initializing seed variable
  169.     seed := 0;
  170.     //generating seed out of sum of ASCII values of key chars
  171.     for posT := 1 to Length(keyStr) do  seed := (seed + ord(keyStr[posT]));
  172.     //setting seed for Random
  173.     RandSeed := seed;
  174.  
  175.     //defining switch
  176.     if dec then x := -1 else x := 1;
  177.  
  178.     for posT := 1 to Length(inStr) do
  179.     begin
  180.          //--capitalized letters--
  181.          if inStr[posT] in ['A'..'Z'] then
  182.          begin
  183.          //normalizing
  184.          curLetter := (ord(inStr[posT]) - ord('A'));
  185.          //shift by random letter between A and Z
  186.          curLetter := (26 + curLetter + x * Random(26)) mod 26;
  187.          //denormalizing and translating to letter
  188.          result[posT] := chr(curLetter + ord('A'));
  189.          //transfere everything else than letters as it is
  190.          end else result[posT] := inStr[posT];
  191.  
  192.          //--uncapitalized letters--
  193.          if inStr[posT] in ['a'..'z'] then
  194.          begin
  195.          curLetter := (ord(inStr[posT]) - ord('a'));
  196.          //shifting by random letter between a and z
  197.          curLetter := (52 + curLetter + x * Random(52)) mod 26;
  198.          result[posT] := chr(curLetter + ord('a'));
  199.          end else result[posT] := inStr[posT];
  200.     end;
  201.  
  202.     except
  203.        //catching exceptions and showing error message
  204.        on E : Exception do showMessage('An '+E.Classname+' error occured: '+E.Message);
  205.     end;
  206.   end;
  207.  
  208.  
  209.  
  210. //amount of blocks
  211. function amBl(i1:integer;i2:integer):integer;
  212. begin
  213.   if (i1 mod i2) <> 0 then result := (i1 div i2) else result := (i1 div i2) - 1;
  214. end;
  215.  
  216. //calculation of block length
  217. function calcBl(keyStr:string):integer;
  218. var i:integer;
  219. begin
  220.   result := 0;
  221.   for i := 1 to Length(keyStr) do
  222.   begin
  223.      result := (result + ord(keyStr[i])) mod 5;
  224.      result := result + 2;
  225.   end;
  226.  
  227. end;
  228.  
  229. //desperate try to add strings
  230. function append(s1,s2:string):string;
  231. begin
  232.   insert(s2,s1,Length(s1)+1);
  233.   result := s1;
  234. end;
  235.  
  236. function rotation(inStr,keyStr:string):string;
  237. var //array of chars -> string
  238.     block,temp:string;
  239.     //position in block  variable
  240.     posB:integer;
  241.     //block length and block count variable
  242.     bl, bc:integer;
  243.     //null character as placeholder
  244.     n : ansiChar;
  245.  
  246. begin
  247.    //calculating block length 2..6
  248.    bl := calcBl(keyStr);
  249.    setLength(block,bl);
  250.    result := '';
  251.    temp := '';
  252.    {n := #00;}
  253.  
  254.    for bc := 0 to amBl(Length(inStr),bl) do
  255.      begin
  256.        //filling block with chars starting from back of virtual block (in inStr)
  257.        for posB := 1 to bl do
  258.        begin
  259.        block[posB] := inStr[bc * bl + posB];
  260.        {if inStr[bc * bl + posB] = ' ' then block[posB] := n;}
  261.        end;
  262.  
  263.        //adding the block in front of the existing result string
  264.        temp := result;
  265.        result := block + temp;
  266.        //result := append(block,temp);
  267.        //result :=  concat(block,temp);
  268.        //if you try this with breakpoints and watches you'll see that it actually works
  269.  
  270.      end;
  271.  
  272. end;
  273.  
  274.  
  275.  
  276. //ACTIONS
  277.  
  278. procedure TLinCryptWindow.FormCreate(Sender: TObject);
  279. begin
  280.   //clearing memos
  281.   Minput.clear;
  282.   Moutput.clear;
  283.  
  284. end;
  285.  
  286.  
  287. procedure TLinCryptWindow.BencClick(Sender: TObject);
  288. var i, order:integer;
  289.     //boolean variable to set to true if  test is passed
  290.     //and to false if something is wrong with password
  291.     test:boolean;
  292. begin
  293. Moutput.clear;
  294. test := true;
  295. order := 0;
  296.  
  297. for i := 1 to Length(Tkey.Text) do
  298. begin
  299.   //only digits, capitalized and uncapitalized letters allowed
  300.   if Tkey.Text[i] in ['0'..'9'] + ['A'..'Z'] + ['a'..'z'] then test := true else
  301.   begin
  302.     showMessage('Password must not contain spaces or spezial characters.'+sLineBreak+
  303.     'Password can only contain capitalized and uncapitalize letters as well as numbers.'+sLineBreak+
  304.     'Please click OK and use another password.');
  305.     test := false;
  306.     //breaking and exiting the BencClick procedure
  307.     exit;
  308.   end;
  309.   //sum of all ASCII values in the key for constant order for one key
  310.   order := order + ord(Tkey.Text[i]);
  311. end;
  312. //calculating a constant value to choose one order out of four
  313. order := order mod 4; //mod 5;
  314.  
  315. if test then
  316.   begin
  317.     case order of
  318.     0: Moutput.Text := pseudoRand(vigenere(caesar(Minput.Text, Tkey.Text, false), Tkey.Text, false), Tkey.Text, false);
  319.     1: Moutput.Text := vigenere(caesar(pseudoRand(Minput.Text, Tkey.Text, false), Tkey.Text, false), Tkey.Text, false);
  320.     2: Moutput.Text := caesar(vigenere(caesar(Minput.Text, Tkey.Text, false), Tkey.Text, false), Tkey.Text, false);
  321.     3: Moutput.Text := pseudoRand(vigenere(pseudoRand(Minput.Text, Tkey.Text, false), Tkey.Text, false), Tkey.Text, false);
  322.     //4: Minput.Text := rotation(vigenere(caesar(pseudoRand(Moutput.Text, Tkey.Text, true), Tkey.Text, true), Tkey.Text, true),Tkey.Text);
  323.     end
  324.   end
  325.  
  326. end;
  327.  
  328.  
  329. procedure TLinCryptWindow.BdecClick(Sender: TObject);
  330. var i,order:integer;
  331.     test:boolean;
  332. begin
  333. Minput.clear;
  334. test := true;
  335. order := 0;
  336.  
  337. for i := 1 to Length(Tkey.Text) do
  338. begin
  339.   if Tkey.Text[i] in ['0'..'9'] + ['A'..'Z'] + ['a'..'z'] then test := true else
  340.   begin
  341.     showMessage('Password must not contain spaces or spezial characters.'+sLineBreak+
  342.     'Password can only contain capitalized and uncapitalize letters as well as numbers.'+sLineBreak+
  343.     'Please click OK and use another password.');
  344.     test := false;
  345.     exit;
  346.   end;
  347.   order := order + ord(Tkey.Text[i]);
  348. end;
  349. order := order mod 4; //mod 5;
  350.  
  351. if test then
  352.   begin
  353.     case order of
  354.     0: Minput.Text := pseudoRand(vigenere(caesar(Moutput.Text, Tkey.Text, true), Tkey.Text, true), Tkey.Text, true);
  355.     1: Minput.Text := vigenere(caesar(pseudoRand(Moutput.Text, Tkey.Text, true), Tkey.Text, true), Tkey.Text, true);
  356.     2: Minput.Text := caesar(vigenere(caesar(Moutput.Text, Tkey.Text, true), Tkey.Text, true), Tkey.Text, true);
  357.     3: Minput.Text := pseudoRand(vigenere(pseudoRand(Moutput.Text, Tkey.Text, true), Tkey.Text, true), Tkey.Text, true);
  358.     //4: Minput.Text := rotation(vigenere(caesar(pseudoRand(Moutput.Text, Tkey.Text, true), Tkey.Text, true), Tkey.Text, true),Tkey.Text);
  359.     end
  360.   end
  361.  
  362. end;
  363.  
  364. procedure TLinCryptWindow.BclipClick(Sender: TObject);
  365. begin
  366.      Moutput.SelectAll;
  367.      Moutput.CopyToClipboard;
  368. end;
  369.  
  370. procedure TLinCryptWindow.HelpClick(Sender: TObject);
  371. begin
  372.    ShellExecute(0, 'open', pchar(ExtractFilePath(Application.ExeName) + 'help.pdf'), nil, nil,sw_ShowNormal);
  373. end;
  374.  
  375. procedure TLinCryptWindow.AboutClick(Sender: TObject);
  376. begin
  377.   Application.MessageBox('Author: Aaron Schade'+sLineBreak+'Date created: 25.05.2014'+sLineBreak+'Version: 1.0', 'About: LinCrypt', MB_ICONINFORMATION)
  378. end;
  379.  
  380.  
  381. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement