Advertisement
greenskyoverme

perl_o_crypt_beta_0_6_pwgen.pl

May 22nd, 2014
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 12.27 KB | None | 0 0
  1. #!/usr/bin/perl                    -w                                                          -l
  2. use hash_table
  3.  
  4. print "Welcome to Perl-O-Crypt. \nThis program is for encrypting messages.";#Begrüßung
  5. print "It also offers the generation of passwords.";
  6.  
  7. print "You have these options: \n\tencrypt message => v\n\tdecrypt message => e \n\tgenerate password => any input";#Abfrage Richtung
  8. $direction = <STDIN>;
  9. chomp $direction;
  10.  
  11. #Ausgabe bei Verschlüsselung
  12. if($direction eq "v"){
  13.     #Abfrage, wie die zu verschlüsselnde Nachricht eingegeben werden soll.
  14.     print "Do you want to enter the text manually or as a file?";
  15.     print "\t m => manual input \n\t any input => input via file";
  16.     $manual = <STDIN>;
  17.     chomp $manual;
  18.    
  19.     if ($manual eq "m") {
  20.         $locktext = <STDIN>;
  21.         chomp $locktext;
  22.         open(MIP,">lock.txt");
  23.         print MIP $locktext;
  24.         close(MIP);
  25.     }
  26.     else{  
  27.         print "\nPlease copy the file that is to be encoded into the program folder.";
  28.         print "Please name it >>lock.txt<<";
  29.     }
  30.     print "Please copy the key into the program folder.";
  31.     print "Please name it >>key.txt<<\n Afterwards press Enter.";
  32.     $return_check = <STDIN>;
  33. }
  34. #Ausgabe bei Entschlüsselung
  35. elsif($direction eq "e"){
  36.     print "\nPlease copy the encrypted file into the program folder.";
  37.     print "Please name it >>unlock.txt<<";
  38.     print "Please copy the key into the program folder.";
  39.     print "Please name it >>key.txt<<\n Afterwards press Enter.";
  40.     $return_check = <STDIN>;
  41. }
  42. #Auslesen und Auswerten des Schlüssels
  43. #====================================
  44.  
  45.     #auslesen der  key.txt-Datei
  46.     open(KEY,"<key.txt");
  47.     $key = <KEY>;
  48.     close(KEY);
  49.    
  50.     #Auslesen des securitylevels (Verschlüsselungszahl)
  51.     $security_level= substr($key,0,1);
  52.     #Hashvariable zur Zuordnung der Bit-Zahlen zu den entsprechenden Schlüsseln
  53.     %security_levels = ('1' => '128', '2' => '256', '3' => '512', '4' => '1024', '5' => '2048', '6' => '4096', '7' => '8192', '8' => '16384');
  54.     $security_level_value = $security_levels{$security_level}; #VS-Zahl in $security_level_value gespeichert
  55.     print "svl: $security_level_value";
  56.    
  57.     #Auslesen der Rotationsvariablen über substr. (Rot. V sind die ersten zwei Ziffern des Key's)
  58.     $rot = substr($key,1,2);      
  59.     $rest= substr($key,3,35);
  60.     print $rest;
  61.    
  62.      #Schleife zur Bestimmung der Insert-Blocks   :
  63.      #Der Insert-Block wird als Element in einem Array ($lock_block[x]) gespeichert.
  64.      #Dafür wird ein Substring aus dem Rest des Schlüssels mit einer Länge von 5 Zeichen genommen. Startpunkt beginnt bei 0 und wird pro Durchlauf um 5 erhöht.
  65.    
  66.     #Definition Parameter für folgende Schleife
  67.     $start_count_lb =0;          
  68.     @lock_block = ('0','1');
  69.     do{                        
  70.        $lock_block[$count_lb] = substr($rest,$start_count_lb,5);
  71.        $start_count_lb = $start_count_lb+5;
  72.        print $lock_block[$count_lb];
  73.        $count_lb = $count_lb+1;
  74. }until($count_lb == 7);
  75.  
  76.  
  77. #VERSCHLÜSSELUNG
  78. #=================================
  79.  
  80. if($direction eq "v"){ #Wenn direction = v...
  81.    
  82.     #Öffnen der Textdatei und Speicherung in der Variablen @locktext
  83.     open(MSG, "<lock.txt");
  84.     @locktext = <MSG>;
  85.     close(MSG);
  86.    
  87.     #Speicherung des Textes in einem Array, sodass jedes Zeichen = $lock_text_array[x]
  88.     $lock_text_string = join("",@locktext);
  89.     $lock_text_string =~s/\n/]/g;
  90.     $length_of_text = length($lock_text_string);
  91.     @lock_text_array =split(//,$lock_text_string);
  92.  
  93.     $count_lta = 0;
  94.    
  95.     do{
  96.         #Abfrage der Zeichnenummer aus der Subroutine Hashtable und generierung der Rot-Zeichen-Nummer.
  97.         #In $lock_string wird das aktuelle Zeichen aus $lock_text_array[$count_lta] gespeichert.
  98.         #In $rot_lock[$count_lta] wird aus der Subroutine, einer Hashfunktion die Zeichennummer abgefragt, dafür wird $lock_string an die Subroutine übergeben.
  99.         $lock_string = $lock_text_array[$count_lta];
  100.         $rot_lock[$count_lta]=&rotation_lock($lock_string);
  101.        
  102.         #Anschließend wird die rotierte Lock-Zahl generiert.
  103.         #Sollte diese größer 70 seinm greift der unten stehende Algoritmus, der bewirkt, dass ab 71 wieder mit 1 angefangen wird.
  104.         if ($rot_lock[$count_lta] +$rot <=70) {
  105.             $rot_lock[$count_lta] = $rot_lock[$count_lta]+ $rot;      
  106.         }
  107.         else{
  108.             $rot_lock[$count_lta] = ($rot_lock[$count_lta]+ $rot)-71;
  109.         }
  110.          print $rot_lock[$count_lta];
  111.        
  112.         #Generierung einer Binärzahl aus der Rot-Zahl
  113.         #Die Zahl zwei wird hoch $index genommen.
  114.         #ist das Ergebnis kleiner als die Dezimalzahl, so ist diese Stelle der Binärzahl mit 1 besetzt. Ist es größer mit 0.
  115.         #Auf diese weise werden durch verkleinerung von $index um 1 und vergrößerung von $postion um 1 alle 7 Stellen der Binärzahl (2^6,2^5...2^0) durchlaufen
  116.         $figure = $rot_lock[$count_lta];
  117.         @binary_figure = ('0','0','0','0','0','0','0',);
  118.         $index = 6;
  119.         $position = 0;
  120.         do{
  121.             $check = 2**$index;
  122.             if ($check <= $figure) {
  123.                 $binary_figure[$position] = 1;
  124.                 $figure = $figure - $check;
  125.             }
  126.             else{
  127.                 $binary_figure[$position] = 0;    
  128.             }
  129.             $position = $position +1;
  130.             $index = $index-1;
  131.            
  132.         }until($position == 7);
  133.        
  134.         print @binary_figure;
  135.        
  136.         $waste_position = 0;
  137.         @crypt = ('1','0');
  138.        
  139.         #Generierung von zufälligen 1en und 0en über die rand-Funktion. (Zahlen zwischen 0 und 2 werden abebrochen)
  140.         #Speicherung jeder einzelnen Ziffer im Element $crypt[$waste_position]
  141.         #Vergrößerung von $waste_position
  142.         do{
  143.             $rand_waste = rand(2);
  144.             $crypt[$waste_position]= int($rand_waste);
  145.             $waste_position = $waste_position +1;
  146.         }until($waste_position == $security_level_value);
  147.         $lock_count = 0;
  148.        
  149.         #Einsetzung der einzlenen Ziffern gemäß den im key definierten Postionen.
  150.         #$lock_count dient als Schalter zum zählen der Einsetzungen
  151.         do{
  152.             $crypting_postion = $lock_block[$lock_count];
  153.             $crypt[$crypting_postion] = $binary_figure[$lock_count];
  154.             $lock_count = $lock_count+1;
  155.         }until($lock_count == 7);
  156.        
  157.         #Speicherung in einer String-Variablen und anschließende Einsetzung der String als Element eines Arrays, indem der Gesamttext steht
  158.         $crypted = join("",@crypt);
  159.         #print $crypted;
  160.         $crypted_message[$count_lta]= $crypted;
  161.        
  162.         $count_lta = $count_lta+1;
  163.     }until($count_lta == $length_of_text);
  164.    
  165.     #Speicherung in einer Datei mit dem Namen locked.txt
  166.     open(CRYPTTEXT,">locked.txt");
  167.     print CRYPTTEXT @crypted_message;
  168.     close CRYPTTEXT;
  169. }
  170.  
  171. #ENTSCHLÜSSELUNG
  172. #=============================
  173.  
  174. elsif($direction eq "e"){
  175.    
  176.     #Öffnen der Datei "unlock.txt" und Speicherung in einer Array-Variablen (@unlock)
  177.     open(DECRYPT,"<unlock.txt");
  178.     @unlock = <DECRYPT>;
  179.     close(DECRYPT);
  180.    
  181.     #Umschreiben der Array-Variablen in eine String-Variable
  182.     $crypted_text = join("",@unlock);
  183.    
  184.     #Bestimmung der Länge des Verschlüsselten Textes und der Anzahl der Zeichen, indem die Gesamtlänge durch das S-Level geteilt wird.
  185.     $crypto_length = length($crypted_text)-1;
  186.     $end = $crypto_length/$security_level_value;
  187.     $end = int($end);
  188.    
  189.     #Auslesen der einzelnen Verschlüsselungsblöcke
  190.     #Die Blöcke werden als Elemente von @crypt_blocks gespeichert. Dafür wird zuerst vom Start ein Substring mit Schrittweite entpsprechend der Blocklänge gebildet.
  191.     #Anschließend Bestimmung der Restlänge und entfernung des vordersten Blocks.
  192.     #Erhöhung des Schalters $cb_count um 1, wiederholung des Vorgangs, bis alle Blöcke eingelesen sind.
  193.     do{
  194.         $crypt_blocks[$cb_count] = substr($crypted_text,0,$security_level_value);
  195.         $text_length = length($crypted_text);
  196.         $substring_parameter = $text_length - $security_level_value;
  197.         $crypted_text = substr($crypted_text,$security_level_value,$substring_parameter);
  198.         $cb_count = $cb_count +1;
  199.  
  200.     }until($cb_count == $end);
  201.  
  202.     #Generierung der Binärzahlen
  203.     #Aus dem Block wird die Binärzahl ausgelesen. Dazu wird aus dem Block für jedes $lock_block ein Substring von 1 gezogen umd die entsprechende Stelle der Binärzahl zu erhalten.
  204.     do{
  205.         #Definition Schalter
  206.         $binary_position = 0;
  207.         $lb_count = 0;
  208.         do{
  209.    
  210.             $binary[$binary_position] = substr($crypt_blocks[$cb_number],$lock_block[$lb_count],1);
  211.             $binary_position = $binary_position +1;
  212.             $lb_count = $lb_count +1;
  213.         }until($lb_count == 7);
  214.    
  215.     #Speicherung der Binärzahl als String
  216.     $complete_binary = join("",@binary);
  217.  
  218.     #Generierung der Dezimalzahl aus der Binärzahl
  219.     #Festlegung Parameter/Schalter
  220.     $bv_index = 6;
  221.     $bva_index = 0;
  222.     $decimal = 0;
  223.     do{
  224.         #Das Binärzahlarray wird komplett Zifferweise durchlaufen.
  225.         #Ist eine Ziffer eine 1, so wird die entsprechende 2er-Potenz gebildet und zur bisherigen Summe addiert.
  226.         #Ist eine Ziffer eine 0, so wird $add = 0, es wird also nichts dazu addiert.
  227.         #print $binary[7];
  228.         if ($binary[$bva_index] == 1) {
  229.             $add = 2**$bv_index;
  230.         }
  231.         else{
  232.             $add = 0;
  233.         }
  234.         $decimal = $decimal+$add;
  235.        
  236.         #Addition bzw. Subtraktion der Schalter
  237.         $bv_index = $bv_index -1;
  238.         $bva_index = $bva_index +1;
  239.     }until($bv_index < 0);
  240.    
  241.     #Entschlüsselung der Rotation:
  242.     #Wenn die generierte Dezimalzahl abzüglich der Rotationszahl <0 ist, so greift der if-Teil:
  243.     #Das negative Ergebnis wird mit 71, dadurch beginnt man nach 0 wieder bei 70.
  244.     #Wenn die generierte Dezimalzahl abzüglich der Rotationszahl = 0 ist, wird einfach nur die Differenz gebildet.
  245.     if ($decimal-$rot < 0) {
  246.         #print $decimal;
  247.         #print $rot;
  248.         $antirot = $decimal - $rot +71;
  249.     }
  250.     else{
  251.         $antirot = $decimal - $rot;
  252.     }
  253.     #Ausgabe des urspünglichen Zeichens:
  254.     #Mit Hilfe der Subroutine "unlock" wird aus einer Hashfunktio das entsprechende Zeichen ausgelsen, und in $decrypted_text[$cb_number] gespeichert.
  255.     $decrypted_text[$cb_number] = &unlock($antirot);
  256.     print $decrypted_text[$cb_number];
  257.     print $cb_number;
  258.  
  259.     #Addition von $cb_number mit 1 und Wiederholung des Verfahrens mit dem nächsten Block.
  260.     $cb_number = $cb_number +1;
  261.    
  262.     }until($cb_number == $end);
  263.     $decrypted_message = join('',@decrypted_text);
  264.     $decrypted_message =~s/]/\n/g;
  265.    
  266.     #Ausgabe der entschlüsselten Nachricht auf Bildschirm
  267.     print "Die entschlüsselte Nachricht lautet:";
  268.     print  $decrypted_message;
  269.     print "Moechten Sie diese Nachricht speichern? (y/n)";
  270.     $save_msg = <STDIN>;
  271.     chomp $save_msg;
  272.    
  273.     if ($save_msg eq "y") {
  274.         #Abfrage des Dateinamens
  275.         print "Unter welchem Dateinamen soll das entschluesselte Ergebnis gespeichert werden?";
  276.         $file_name = <STDIN>;
  277.         chomp $file_name;
  278.        
  279.         #Speicherung in der Datei
  280.         open(UNLOCKED,">$file_name.txt");
  281.         print UNLOCKED $decrypted_message;
  282.         close(UNLOCKED);
  283.         print "Nachricht als >>$file_name.txt<< gespeichert";
  284.     }
  285.    
  286. }
  287.  
  288.  
  289. #PASSWORTGENERATOR
  290. #=======================
  291. else{
  292.     #Abfrage der Passwortlänge
  293.     print "How many characters should the password have?";
  294.     $pw_length = <STDIN>;
  295.     chomp $pw_length;
  296.    
  297.     #Generierung des Passwortes:
  298.     #Eine Zufallszahl wird gebildet (zwischen 0 und 71)
  299.     #Aus der Unlock-Subroutine wird das entsprechende Zeichen entnommen
  300.     #Wird in Array gepseichert
  301.     do{
  302.         $random = rand(71);
  303.         $random = int($random);
  304.         $key_sign[$ks_count] = &unlock($random);
  305.         $ks_count = $ks_count +1;
  306.     }until($ks_count == $pw_length);
  307.    
  308.     #Ausgabe des Passwortes in der Datei Passwort.txt
  309.     open(PW,">password.txt");
  310.     print PW @key_sign;
  311.     close(PW);
  312. }
  313.  
  314. print "Any input to leave the program";
  315. $exit_programm = <STDIN>;
  316.  
  317. exit;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement