#! /usr/bin/perl


# Amnesia v1.0 
# Testato su FreeBSD 4.5 e Linux Red Hat 8.0 


# coded by cers

# - cers labs software - www.cers.tk - admin@cers.tk



menu:
print "\n
 -- Amnesia v1.0 --

1) Crypta file
2) Decrypta file
3) Crypta directory
4) Decrypta directory

6) Esci

Scelta: "; 

$scelta = <STDIN>;
if ($scelta == 1) { goto crypta; }
if ($scelta == 2) { goto decrypta; }
if ($scelta == 3) { goto crypta_dir; }
if ($scelta == 4) { goto decrypta_dir; }
if ($scelta == 6) { exit; }
system(clear);
goto menu;

# Acquisizione ed elaborazione delle password
sub genera_key {
crypta_pass1:
print "\nInserisci la password n.1: ";
system('stty -echo');
$pass1 = <STDIN>;
chop $pass1;
print "\n-Ridigita la password n.1: ";
$controllo_pass1 = <STDIN>;
chop $controllo_pass1;
if ($pass1 ne $controllo_pass1) {
	print "\nLa password digitata e' diversa dalla precedente.\n";
	goto crypta_pass1;
}

crypta_pass2:
print "\n\nInserisci la password n.2: ";
$pass2 = <STDIN>;
chop $pass2;
print "\n-Ridigita la password n.2: ";
$controllo_pass2 = <STDIN>;
chop $controllo_pass2;
if ($pass2 ne $controllo_pass2) {
	print "\nLa password digitata e' diversa dalla precedente.";
	goto crypta_pass2;
}

crypta_pass3:
print "\n\nInserisci la password n.3: ";
$pass3 = <STDIN>;
chop $pass3;
print "\n-Ridigita la password n.3: ";
$controllo_pass3 = <STDIN>;
chop $controllo_pass3;
if ($pass3 ne $controllo_pass3) {
	print "\nLa password digitata e' diversa dalla precedente.";
	goto crypta_pass3;
}
system('stty echo');

# password -> 13 bits


# Personalizzabile per aumentare il livello di sicurezza
$salto = 'cers';
# Il tool utilizzato per il decrypt deve avere lo stesso identico salto del
# tool utilizzato per il crypt.



$passcrypt[1] = crypt($pass1,$salto);
$passcrypt[2] = crypt($pass2,$salto);
$passcrypt[3] = crypt($pass3,$salto);

## password 13 bits -> 3 key numeriche 39 bits ##

@passcry = split ("",$passcrypt[1]);
@passcry2 = split ("",$passcrypt[2]);
@passcry3 = split ("",$passcrypt[3]);

$passcrypt2[1] = $passcry[0];
$passcrypt2[1] .= $passcry2[12];
$passcrypt2[1] .= $passcry3[0];
$passcrypt2[1] .= $passcry[1];
$passcrypt2[1] .= $passcry2[11];
$passcrypt2[1] .= $passcry3[1];
$passcrypt2[1] .= $passcry[2];
$passcrypt2[1] .= $passcry2[10];
$passcrypt2[1] .= $passcry3[2];
$passcrypt2[1] .= $passcry[3];
$passcrypt2[1] .= $passcry2[9];
$passcrypt2[1] .= $passcry3[3];
$passcrypt2[1] .= $passcry[4];
$passcrypt2[2] = $passcry2[8];
$passcrypt2[2] .= $passcry3[4];
$passcrypt2[2] .= $passcry[5];
$passcrypt2[2] .= $passcry2[7];
$passcrypt2[2] .= $passcry3[5];
$passcrypt2[2] .= $passcry[6];
$passcrypt2[2] .= $passcry2[6];
$passcrypt2[2] .= $passcry3[6];
$passcrypt2[2] .= $passcry[7];
$passcrypt2[2] .= $passcry2[5];
$passcrypt2[2] .= $passcry3[7];
$passcrypt2[2] .= $passcry[8];
$passcrypt2[2] .= $passcry2[4];
$passcrypt2[3] = $passcry3[8];
$passcrypt2[3] .= $passcry[9];
$passcrypt2[3] .= $passcry2[3];
$passcrypt2[3] .= $passcry3[9];
$passcrypt2[3] .= $passcry[10];
$passcrypt2[3] .= $passcry2[2];
$passcrypt2[3] .= $passcry3[10];
$passcrypt2[3] .= $passcry[11];
$passcrypt2[3] .= $passcry2[1];
$passcrypt2[3] .= $passcry3[11];
$passcrypt2[3] .= $passcry[12];
$passcrypt2[3] .= $passcry2[0];
$passcrypt2[3] .= $passcry3[12];




$numero_pass = 1;
while ( $numero_pass < 4 ) {


@Apass1 = split("","$passcrypt2[$numero_pass]");
$n = 0;

while ($n < 13) {

# standard 3 bits
$temp1 = ord $Apass1[$n];
if (length($temp1) < 3) {
$temp1 = "0"."$temp1";
}
#

$elabpass[$numero_pass] .= $temp1;
$n += 1;
}
$numero_pass += 1;
}

# 3 key numeriche 39 bits > 6 key numeriche 117 bits

$key1 = "$elabpass[1]"."$elabpass[2]"."$elabpass[3]";
$key2 = "$elabpass[1]"."$elabpass[3]"."$elabpass[2]";
$key3 = "$elabpass[2]"."$elabpass[1]"."$elabpass[3]";
$key4 = "$elabpass[2]"."$elabpass[3]"."$elabpass[1]";
$key5 = "$elabpass[3]"."$elabpass[1]"."$elabpass[2]";
$key6 = "$elabpass[3]"."$elabpass[2]"."$elabpass[1]";

# key finale numerica a 702 bits

$key0 = "$key1"."$key2"."$key3"."$key4"."$key5"."$key6";

# Frammentazione in blocchi cifratura da 3 bits

@key0 = split("",$key0);
$numero_shift = 0;

while ( $numero_shift < 234 ) {
 
$blocco[$numero_shift] = shift @key0;
$blocco[$numero_shift] .= shift @key0;
$blocco[$numero_shift] .= shift @key0;
$numero_shift += 1;
}
}

# CRYPTA
crypta:
print "\n\nInserisci nome file da cryptare: ";
$file = <STDIN>;
print "\nInserisci nome file output: ";
$file_ris = <STDIN>;
genera_key;
sub crypta {
open (LEGGO,"<$file");
open (SCRIVO,">$file_ris");
while (!eof(LEGGO)) {
$riga = <LEGGO>;
@dati = split ("",$riga);
$numero_caratteri = 0;
$numero_shift = 0;
$numero_unshift = 0;
while ( $numero_caratteri < @dati ) {
$converti = $dati[$numero_caratteri];
$convertito = ord $converti;
if ($convertito < 3) {
$convertito = "0"."$convertito";
}
$cifratura1 = shift @blocco;
$cifratura2 = shift @blocco;
push @blocco,$cifratura1;
push @blocco,$cifratura2;
$convertito2 = "$cifratura1" + "$convertito";
$cryptato = log($cifratura2)^$convertito2;
$offuscato = chr($cryptato);
syswrite SCRIVO,$offuscato;
$numero_caratteri += 1;
}
}
}
crypta;
print "\nOperazione terminata\n";
sleep 2;
system(clear);
goto menu;

decrypta:

print "\n\nInserisci il nome file da decryptare: ";
$file_crypt = <STDIN>;
print "\nInserisci il nome file output: ";
$file_ris = <STDIN>;
genera_key;
sub decrypta {
open (LEGGO,"<$file_crypt");
open (SCRIVO,">$file_ris");

while (!eof(LEGGO)) {
$riga = <LEGGO>;
@dati = split ("",$riga);
$numero_caratteri = 0;
while ($numero_caratteri < @dati) {
$converti = $dati[$numero_caratteri]; 
$convertito = ord $converti;
if ($convertito < 3) {
$convertito = "0"."$convertito";
}
$cifratura2 = shift @blocco;
$cifratura1 = shift @blocco;
push @blocco,$cifratura2;
push @blocco,$cifratura1;
$convertito2 = log($cifratura1)^$convertito;
$decryptato = "$convertito2" - "$cifratura2";
$chiaro = chr($decryptato);
syswrite SCRIVO,$chiaro;
$numero_caratteri += 1;
}
}
}
decrypta;
print "\n\nOperazione terminata\n";
sleep 2;
system(clear);
goto menu;

crypta_dir:
print "\n\nInserisci il nome della directory: ";
$directory = <STDIN>;
print "\nInserisci il nome del file output: ";
$file_ris = <STDIN>;
genera_key;
$cmd = "tar -cf crstempxxx.tar $directory";
system($cmd);
$file = 'crstempxxx.tar';
crypta;
$cmd3 = "rm -f crstempxxx.tar";
system($cmd3);
print "\n\nOperazione terminata con successo\n";
sleep 2;
system(clear);
goto menu;

decrypta_dir:
print "\n\nInserisci il nome della dir cryptata: ";
$file_crypt = <STDIN>;
genera_key;
$file_ris = 'crstempxxxx.tar';
decrypta;
$cmd1 = "tar -xf crstempxxxx.tar";
system($cmd1);
$cmd3 = "rm -f crstempxxxx.tar";
system($cmd3);
print "\nOperazione terminata\n";
sleep 2;
system(clear);
goto menu;