Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .idea/libraries/bytedeco_javacv_platform.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion databases.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,2 @@
{
"esffs": "e4aebaf0f1b173cdf19ae33a5539cc4e52990f37473f6f41623e1a3a346fa713"
}
61 changes: 53 additions & 8 deletions src/Classes/DatabasesManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,38 +14,44 @@

public class DatabasesManager {
private final File databasesFile;
private final Map<String, String> databases;
Sha256 sha256 = new Sha256();
private final Map<String, Database> databases;
private final Sha256 sha256 = new Sha256();

public DatabasesManager(File databasesFile) {
this.databasesFile = databasesFile;
this.databases = loadDatabases();
this.databases = loadDatabases() != null ? loadDatabases() : new HashMap<>();
}

public boolean verifyDatabase(String dbName, String password) {
if (!databases.containsKey(dbName)) return false;
Database database = databases.get(dbName);
String hashedPassword = sha256.calculateHash(password);
return databases.containsKey(dbName) && databases.get(dbName).equals(hashedPassword);
return database.getHashPassword().equals(hashedPassword);
}

public void createDatabase(String dbName, String password) {
public void createDatabase(String dbName, String password, Map<String, String> encryptionMap) {
if (databases.containsKey(dbName)) {
throw new IllegalArgumentException("Database already exists.");
}
String hashedPassword = sha256.calculateHash(password);
databases.put(dbName, hashedPassword);
Database newDatabase = new Database(dbName, hashedPassword, encryptionMap);
databases.put(dbName, newDatabase);
saveDatabases();
}

public Map<String, String> loadDatabases() {
private Map<String, Database> loadDatabases() {
if (!databasesFile.exists()) return new HashMap<>();
try (FileReader reader = new FileReader(databasesFile)) {
Gson gson = new Gson();
Type type = new TypeToken<Map<String, String>>() {}.getType();
Type type = new TypeToken<Map<String, Database>>() {}.getType();
return gson.fromJson(reader, type);
} catch (IOException e) {
e.printStackTrace();
return new HashMap<>();
}
}


private void saveDatabases() {
try (FileWriter writer = new FileWriter(databasesFile)) {
Gson gson = new GsonBuilder().setPrettyPrinting().create();
Expand All @@ -54,4 +60,43 @@ private void saveDatabases() {
e.printStackTrace();
}
}

// Classe interne représentant une base de données
public static class Database {
private final String name;
private final String hashPassword;
private final Map<String, String> encryptionMap;

public Database(String name, String hashPassword, Map<String, String> encryptionMap) {
this.name = name;
this.hashPassword = hashPassword;
this.encryptionMap = encryptionMap;
}

public String getName() {
return name;
}

public String getHashPassword() {
return hashPassword;
}

public Map<String, String> getEncryptionMap() {
return encryptionMap;
}
}
public Map<String, String> getEncryptionMap(String dbName) {
if (!databases.containsKey(dbName)) {
throw new IllegalArgumentException("Database does not exist: " + dbName);
}
try (FileReader reader = new FileReader(databasesFile)) {
Gson gson = new Gson();
Map<String, Map<String, Object>> allDatabases = gson.fromJson(reader, Map.class);
Map<String, Object> dbData = allDatabases.get(dbName);
return (Map<String, String>) dbData.get("encryptionMap");
} catch (IOException e) {
throw new RuntimeException("Failed to read databases file.", e);
}
}

}
1 change: 1 addition & 0 deletions src/Classes/HelpMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public static void displayMenuHelp(Scanner scanner) {
break;
case 6:
System.out.println("Exiting help menu..."); // Exit message.
Menu.main(null); // Return to the main menu.
break;
default:
System.out.println("Invalid choice. Please select a valid option."); // Handle invalid input.
Expand Down
56 changes: 51 additions & 5 deletions src/Classes/Menu.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package Classes;

import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

Expand Down Expand Up @@ -33,8 +34,12 @@ public static void main(String[] args) {
// Verify the database credentials
if (dbManager.verifyDatabase(dbName, inputPassword)) {
System.out.println("Successfully connected to the database: " + dbName);

// Retrieve the encryption map for the database
Map<String, String> encryptionMap = dbManager.getEncryptionMap(dbName);

// Initialize the SiteManager to manage sites within the database
SiteManager siteManager = new SiteManager(new File(dbName + ".json"));
SiteManager siteManager = new SiteManager(new File(dbName + ".json"), encryptionMap);
siteManager.manageSites(scanner); // Begin managing sites
} else {
System.out.println("Incorrect database name or password."); // Error message for invalid credentials
Expand All @@ -58,14 +63,55 @@ else if (dbChoice == 2) {
: PasswordUtils.generateRandomPassword(12); // Generate a random password

System.out.println("Generated password: " + password);
// Create the new database with the given name and password
dbManager.createDatabase(dbName, password);

// Ask the user for encryption methods
Map<String, String> encryptionMap = new HashMap<>();
boolean addMoreEncryptions = true;

while (addMoreEncryptions) {
System.out.println("Choose an encryption method:");
System.out.println("1. RotX");
System.out.println("2. RC4");
System.out.println("3. Vigenere");
System.out.println("4. Polybios");
System.out.println("5. Done adding encryptions");

int encryptionChoice = scanner.nextInt();
scanner.nextLine(); // Consume newline character

switch (encryptionChoice) {
case 1 -> {
System.out.println("Enter the shift value for RotX:");
String shiftValue = scanner.nextLine();
encryptionMap.put("RotX", shiftValue);
}
case 2 -> {
System.out.println("Enter the key for RC4:");
String rc4Key = scanner.nextLine();
encryptionMap.put("RC4", rc4Key);
}
case 3 -> {
System.out.println("Enter the key for Vigenere:");
String vigenereKey = scanner.nextLine();
encryptionMap.put("Vigenere", vigenereKey);
}
case 4 -> {
encryptionMap.put("Polybios", "default");
}
case 5 -> addMoreEncryptions = false;
default -> System.out.println("Invalid choice. Please choose a valid encryption method.");
}
}

// Create the new database with the given name, password, and encryption map
dbManager.createDatabase(dbName, password, encryptionMap);

// Initialize the SiteManager for the new database
SiteManager siteManager = new SiteManager(new File(dbName + ".json"));
SiteManager siteManager = new SiteManager(new File(dbName + ".json"), encryptionMap);
siteManager.manageSites(scanner); // Begin managing sites
}
// Handle the case where the user wants to access the help menu
else if (dbChoice == 3){
else if (dbChoice == 3) {
HelpMenu.displayMenuHelp(scanner); // Display the help menu
}
// Handle invalid choices
Expand Down
113 changes: 104 additions & 9 deletions src/Classes/SiteManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,11 @@
public class SiteManager {
private final File dbFile;
private final List<Map<String, String>> sites;
private final Map<String, String> encryptionMap; // Méthodes de chiffrement associées

public SiteManager(File dbFile) {
public SiteManager(File dbFile, Map<String, String> encryptionMap) {
this.dbFile = dbFile;
this.encryptionMap = encryptionMap;
this.sites = loadSites();
}

Expand All @@ -24,22 +26,27 @@ public void manageSites(Scanner scanner) {
System.out.println("1. Add a site");
System.out.println("2. Modify a site");
System.out.println("3. Delete a site");
System.out.println("4. Exit");
System.out.println("4. Display all sites");
System.out.println("5. Exit");
int choice = scanner.nextInt();
scanner.nextLine();

switch (choice) {
case 1 -> addSite(scanner);
case 2 -> modifySite(scanner);
case 3 -> deleteSite(scanner);
case 4 -> { return; }
case 4 -> displaySites();
case 5 -> { return; }
default -> System.out.println("Invalid choice.");
}
}
}

public void addSite(String siteName, String username, String password) {
Map<String, String> site = Map.of("siteName", siteName, "username", username, "password", password);
Map<String, String> site = new HashMap<>();
site.put("siteName", siteName);
site.put("username", username);
site.put("password", password);
sites.add(site);
saveSites();
}
Expand All @@ -63,12 +70,10 @@ public void modifySite(String siteName, String newUsername, String newPassword)
if (newPassword != null && !newPassword.isEmpty()) {
site.put("password", newPassword);
}
System.out.println("Modified site: " + site);
saveSites();
return;
}
}
System.out.println("Site not found for modification: " + siteName);
throw new IllegalArgumentException("Site not found: " + siteName);
}

Expand All @@ -82,7 +87,6 @@ public void modifySite(Scanner scanner) {
modifySite(siteName, newUsername, newPassword);
}


public void deleteSite(String siteName) {
sites.removeIf(site -> site.get("siteName").equals(siteName));
saveSites();
Expand All @@ -94,25 +98,116 @@ public void deleteSite(Scanner scanner) {
deleteSite(siteName);
}

public void displaySites() {
if (sites.isEmpty()) {
System.out.println("No sites available.");
} else {
for (Map<String, String> site : sites) {
String siteName = site.get("siteName");
String username = site.get("username");
String password = site.get("password");
System.out.println("Site Name: " + siteName);
System.out.println("Username: " + username);
System.out.println("Password: " + password);
System.out.println("-----------------------------");
}
}
}

public List<Map<String, String>> loadSites() {
if (!dbFile.exists()) return new ArrayList<>();
try (FileReader reader = new FileReader(dbFile)) {
// Lire le fichier et déchiffrer son contenu
StringBuilder encryptedContent = new StringBuilder();
int c;
while ((c = reader.read()) != -1) {
encryptedContent.append((char) c);
}

// Déchiffrement du contenu entier
String decryptedContent = decrypt(encryptedContent.toString());

Gson gson = new Gson();
Map<String, Object> data = gson.fromJson(reader, Map.class);
Map<String, Object> data = gson.fromJson(decryptedContent, Map.class);
return (List<Map<String, String>>) data.get("sites");
} catch (IOException e) {
e.printStackTrace();
return new ArrayList<>();
}
}

public void saveSites() {
try (FileWriter writer = new FileWriter(dbFile)) {
// Conversion des sites en JSON
Gson gson = new GsonBuilder().setPrettyPrinting().create();
Map<String, Object> data = Map.of("sites", sites);
gson.toJson(data, writer);
String jsonContent = gson.toJson(data);

// Chiffrer le contenu JSON
String encryptedContent = encrypt(jsonContent);

writer.write(encryptedContent);
} catch (IOException e) {
e.printStackTrace();
}
}

private String encrypt(String input) {
String result = input;
for (String method : encryptionMap.keySet()) {
switch (method) {
case "RotX" -> {
int shift = Integer.parseInt(encryptionMap.get("RotX"));
result = ROTX.encryptROT(result, shift);
}
case "RC4" -> {
RC4 rc4 = new RC4();
String key = encryptionMap.get("RC4");
rc4.init(key);
result = rc4.encrypt(result);
}
case "Vigenere" -> {
String key = encryptionMap.get("Vigenere");
result = VigenereAlgo.encrypt(result, key);
}
case "Polybios" -> {
}
case "AES" -> {
}
}
}
return result;
}

private String decrypt(String input) {
String result = input;
// Inverser l'ordre des méthodes pour le déchiffrement
List<String> methods = new ArrayList<>(encryptionMap.keySet());
Collections.reverse(methods);

for (String method : methods) {
switch (method) {
case "RotX" -> {
int shift = Integer.parseInt(encryptionMap.get("RotX"));
result = ROTX.decryptROT(result, shift);
}
case "RC4" -> {
RC4 rc4 = new RC4();
String key = encryptionMap.get("RC4");
rc4.init(key);
result = rc4.decrypt(result);
}
case "Vigenere" -> {
String key = encryptionMap.get("Vigenere");
result = VigenereAlgo.decrypt(result, key);
}
case "Polybios" -> {
}
case "AES" -> {
}
}
}
return result;
}

}
Loading
Loading