Skip to content

Commit

Permalink
goshield v1.0 sans gestion de concurrence
Browse files Browse the repository at this point in the history
  • Loading branch information
Heisenberk committed Apr 11, 2019
1 parent e159e90 commit ee27eae
Show file tree
Hide file tree
Showing 11 changed files with 127 additions and 169 deletions.
1 change: 1 addition & 0 deletions command/command.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package command

import "fmt"
import "errors"

import "github.com/Heisenberk/goshield/structure"
import "github.com/Heisenberk/goshield/crypto"

Expand Down
2 changes: 1 addition & 1 deletion command/command_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
package command

import "testing"
//import "io/ioutil"

import "github.com/Heisenberk/goshield/structure"

// TestSansArgument teste la commande "./goshield"
Expand Down
129 changes: 65 additions & 64 deletions crypto/decrypt.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// Package crypto contenant les fonctions de chiffrement/déchiffrement.
package crypto

import "crypto/aes"
Expand All @@ -18,13 +19,13 @@ func DecryptBlocAES(iv []byte, key []byte, input []byte) ([]byte, error){

// Si la taille de l'entrée est invalide on lance une erreur.
if len(input)%aes.BlockSize != 0 {
return output, errors.New("Failure Decryption : Taille du bloc invalide.")
return output, errors.New("\033[31mFailure Decryption\033[0m : Taille du bloc invalide.")
}

// Preparation du bloc qui sera chiffré.
block, err := aes.NewCipher(key)
if err != nil {
return output, errors.New("Failure Decryption : Erreur lors du déchiffrement d'un bloc.")
return output, errors.New("\033[31mFailure Decryption\033[0m : Erreur lors du déchiffrement d'un bloc.")
}

// Chiffrement AES avec le mode opératoire CBC.
Expand All @@ -40,29 +41,29 @@ func DecryptFileAES(pathFile string, doc *structure.Documents) error{
// ouverture du fichier à déchiffrer
inputFile, err1 := os.Open(pathFile)
if err1 != nil {
var texteError string = "Failure Decryption : Impossible d'ouvrir le fichier à déchiffrer "+pathFile+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible d'ouvrir le fichier à déchiffrer "+pathFile+". "
return errors.New(texteError)
}

// renvoie une erreur si l'extension n'est pas la bonne
if pathFile[(len(pathFile)-4):]!= ".gsh"{
var texteError string = "Failure Decryption : L'extension de "+pathFile+" est invalide (doit être \".gsh\"). "
var texteError string = "\033[31mFailure Decryption\033[0m : L'extension de "+pathFile+" est invalide (doit être \".gsh\"). "
return errors.New(texteError)
}

// renvoie une erreur si la signature n'est pas correcte
signature := make([]byte, 8)
_, err2 := inputFile.Read(signature)
if err2 != nil {
var texteError string = "Failure Decryption : Format du fichier à déchiffrer "+pathFile+" invalide. "
var texteError string = "\033[31mFailure Decryption\033[0m : Format du fichier à déchiffrer "+pathFile+" invalide. "
return errors.New(texteError)
}

// lecture du salt et déduction de la clé
salt := make([]byte, 15)
_, err22 := inputFile.Read(salt)
if err22 != nil {
var texteError string = "Failure Decryption : Impossible de lire le salt du fichier chiffré "+pathFile+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible de lire le salt du fichier chiffré "+pathFile+". "
return errors.New(texteError)
}
doc.Salt=salt
Expand All @@ -72,47 +73,43 @@ func DecryptFileAES(pathFile string, doc *structure.Documents) error{
IV := make([]byte, 16)
_, err23 := inputFile.Read(IV)
if err23 != nil {
var texteError string = "Failure Decryption : Impossible de lire la valeur d'initialisation du fichier chiffré "+pathFile+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible de lire la valeur d'initialisation du fichier chiffré "+pathFile+". "
return errors.New(texteError)
}

// lecture de la taille du dernier bloc
lengthTab := make([]byte, 1)
_, err24 := inputFile.Read(lengthTab)
if err24 != nil {
var texteError string = "Failure Decryption : Impossible de lire la taille du dernier bloc du fichier chiffré "+pathFile+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible de lire la taille du dernier bloc du fichier chiffré "+pathFile+". "
return errors.New(texteError)
}

stat, err2 := inputFile.Stat()
if err2 != nil {
var texteError string = "Failure Decryption : Impossible d'interpréter le fichier à déchiffrer "+pathFile+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible d'interpréter le fichier à déchiffrer "+pathFile+". "
return errors.New(texteError)
}

// on soustrait la taille de la signature (8) + le salt (15) + IV (16) + taille du dernier bloc (1)
var division int = (int)((stat.Size()-8-15-16-1)/aes.BlockSize)
var iterations int = division
if (int)(stat.Size()-8-15-16-1)%aes.BlockSize != 0 {
var texteError string = "Failure Decryption : Fichier" + pathFile +" non conforme pour le déchiffrement AES. "
var texteError string = "\033[31mFailure Decryption\033[0m : Fichier" + pathFile +" non conforme pour le déchiffrement AES. "
return errors.New(texteError)
}

// ouverture du fichier résultat
var nameOutput string=pathFile[:(len(pathFile)-4)]
outputFile, err3 := os.Create(nameOutput)
if err3 != nil {
var texteError string = "Failure Decryption : Impossible d'écrire le fichier chiffré "+nameOutput+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible d'écrire le fichier chiffré "+nameOutput+". "
return errors.New(texteError)
}

input := make([]byte, 16)
var cipherBlock []byte
temp := make([]byte, 16)

fmt.Println(iterations)
fmt.Println(lengthTab)
fmt.Println("coucou")

for i:=0 ; i<iterations ; i++ {

Expand All @@ -126,7 +123,7 @@ func DecryptFileAES(pathFile string, doc *structure.Documents) error{
// lecture de chaque bloc de 16 octets
_, err8 := inputFile.Read(input)
if err8 != nil {
var texteError string = "Failure Decryption : Impossible de lire dans le fichier à déchiffrer "+pathFile+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible de lire dans le fichier à déchiffrer "+pathFile+". "
return errors.New(texteError)
}

Expand All @@ -137,7 +134,7 @@ func DecryptFileAES(pathFile string, doc *structure.Documents) error{
var err10 error
cipherBlock, err10 = DecryptBlocAES(IV, doc.Hash, input)
if err10 != nil {
var texteError string = "Failure Decryption : Impossible de déchiffrer le fichier "+pathFile+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible de déchiffrer le fichier "+pathFile+". "
return errors.New(texteError)
}

Expand All @@ -146,13 +143,13 @@ func DecryptFileAES(pathFile string, doc *structure.Documents) error{
if lengthTab[0]!= 0 {
_, err11 := outputFile.Write(cipherBlock[:lengthTab[0]])
if err11 != nil {
var texteError string = "Failure Decryption : Impossible d'écrire dans le fichier "+nameOutput+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible d'écrire dans le fichier "+nameOutput+". "
return errors.New(texteError)
}
}else {
_, err12 := outputFile.Write(cipherBlock)
if err12 != nil {
var texteError string = "Failure Decryption : Impossible d'écrire dans le fichier "+nameOutput+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible d'écrire dans le fichier "+nameOutput+". "
return errors.New(texteError)
}
}
Expand All @@ -161,7 +158,7 @@ func DecryptFileAES(pathFile string, doc *structure.Documents) error{
}else {
_, err13 := outputFile.Write(cipherBlock)
if err13 != nil {
var texteError string = "Failure Decryption : Impossible d'écrire dans le fichier "+nameOutput+". "
var texteError string = "\033[31mFailure Decryption\033[0m : Impossible d'écrire dans le fichier "+nameOutput+". "
return errors.New(texteError)
}
}
Expand All @@ -171,97 +168,101 @@ func DecryptFileAES(pathFile string, doc *structure.Documents) error{
inputFile.Close()
outputFile.Close()

var messageSuccess string = "- Success Decryption "+pathFile+" : resultat dans le fichier "+nameOutput
var messageSuccess string = "- \033[32mSuccess Decryption\033[0m : "+pathFile+" : resultat dans le fichier "+nameOutput
fmt.Println(messageSuccess)

return nil
}

// DecryptFolder déchiffre le contenu d'un dossier de chemin path avec les données doc.
func DecryptFolder (path string, d *structure.Documents) {
//On lit dans le dossier visée par le chemin
entries, err := ioutil.ReadDir(path)

// Lecture du chemin à déchiffrer.
entries, err := ioutil.ReadDir(path)
if err != nil {
fmt.Println("- Failure Decryption : impossible d'ouvrir "+path)
fmt.Println("- \033[31mFailure Decryption\033[0m : impossible d'ouvrir "+path)
}
for _, entry := range entries {

// si l'extension du fichier est différent de .gsh on peut chiffrer le fichier
//if(p[len(p)-4:]==".gsh"){

//crypto.EncryptFileAES(path+entry.Name(),d)

newPath := path+entry.Name()
// Déchiffrement de chaque élément du dossier.
for _, entry := range entries {

fi, err := os.Stat(newPath)
valid := true
if err != nil {
fmt.Println("- Failure Decryption : "+newPath+" n'existe pas ")
valid = false
}
newPath := path+entry.Name()
fi, err := os.Stat(newPath)
valid := true
if err != nil {
fmt.Println("- \033[31mFailure Decryption\033[0m : "+newPath+" n'existe pas ")
valid = false
}

if valid == true {
mode := fi.Mode();
// si l'élément du dossier existe.
if valid == true {

//si l'objet spécifié par le chemin est un dossier.
if(mode.IsDir()==true){
mode := fi.Mode();

//Si l'utilisateur a oublié le "/" à la fin du chemin du fichier
if(strings.LastIndexAny(newPath, "/") != len(newPath) - 1){
newPath=newPath+ string(os.PathSeparator)
//appeler EncryptFolder
DecryptFolder(newPath, d)
}
//si l'objet spécifié par le chemin est un dossier.
if(mode.IsDir()==true){

// si l'objet spécifié par le chemin est un fichier.
}else if mode.IsRegular()== true {
if newPath[len(newPath)-4:]==".gsh"{
errFile := DecryptFileAES(newPath,d)
if errFile != nil {
fmt.Println(errFile)
}
}

//Si l'utilisateur a oublié le "/" à la fin du chemin du fichier
if(strings.LastIndexAny(newPath, "/") != len(newPath) - 1){
newPath=newPath+ string(os.PathSeparator)

}
DecryptFolder(newPath, d)

// si l'objet spécifié par le chemin est un fichier.
}else if mode.IsRegular()== true {

// si l'extension du fichier est différent de .gsh on peut chiffrer le fichier.
if newPath[len(newPath)-4:]==".gsh"{
errFile := DecryptFileAES(newPath,d)
if errFile != nil {
fmt.Println(errFile)
}
}
}
//}
}
}
}

// DecryptFileFolder déchiffre les éléments choisis par l'utilisateur avec les données doc.
func DecryptFileFolder(d *structure.Documents) {

// Pour chaque élément choisi par l'utilisateur.
for i := 0; i < len(d.Doc); i++ {

// Ouverture de l'élément.
fi, err := os.Stat(d.Doc[i])
valid := true
if err != nil {
fmt.Println("- Failure Decryption : "+d.Doc[i]+" n'existe pas ")
fmt.Println("- \033[31mFailure Decryption\033[0m : "+d.Doc[i]+" n'existe pas ")
valid = false
}

// Si l'élément est valide.
if valid == true {
mode := fi.Mode();

//si l'objet spécifié par le chemin est un dossier.
// Si l'élément spécifié par le chemin est un dossier.
if(mode.IsDir()==true){

//Si l'utilisateur a oublié le "/" à la fin du chemin du fichier
// Si l'utilisateur a oublié le "/" à la fin du chemin du fichier.
if(strings.LastIndexAny(d.Doc[i], "/") != len(d.Doc[i]) - 1){
d.Doc[i]=d.Doc[i]+ string(os.PathSeparator)
//appeler EncryptFolder
DecryptFolder(d.Doc[i], d)
}

// Déchiffrement du dossier.
DecryptFolder(d.Doc[i], d)

// si l'objet spécifié par le chemin est un fichier.
}else if mode.IsRegular()== true {

// Déchiffrement du fichier.
errFile := DecryptFileAES(d.Doc[i],d)
if errFile != nil {
fmt.Println(errFile)
}
}

}

}
}

Expand Down
3 changes: 3 additions & 0 deletions crypto/decrypt_test.go
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// Package crypto contenant les fonctions de chiffrement/déchiffrement.
package crypto

import "testing"
Expand All @@ -8,6 +9,7 @@ import "bytes"

import "github.com/Heisenberk/goshield/structure"

// Test de chiffrement sur un bloc.
func TestDecryptBlocAES(t *testing.T){

// IV sur 16 octets (128 bits).
Expand All @@ -32,6 +34,7 @@ func TestDecryptBlocAES(t *testing.T){

}

// Test de chiffrement suivi de déchiffrement sur le fichier env/test/test6.md
func TestEncryptDecryptFile(t * testing.T){

var d structure.Documents
Expand Down
Loading

0 comments on commit ee27eae

Please sign in to comment.