From ade1fde247c21afbdb82be3a809e230f4958ee58 Mon Sep 17 00:00:00 2001
From: saintdi25u <corentinstd@gmail.com>
Date: Sat, 24 Feb 2024 15:57:53 +0100
Subject: [PATCH] =?UTF-8?q?feat-transaction=20:=20impl=C3=A9mentation=20de?=
 =?UTF-8?q?=20la=20signature?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 keystore.jks                            | Bin 2061 -> 2063 bytes
 src/main/java/fr/miage/App.java         |  11 +-
 src/main/java/fr/miage/Bloc.java        |   6 +-
 src/main/java/fr/miage/Blockchain.java  |  54 +++++++-
 src/main/java/fr/miage/Coinbase.java    |   5 +-
 src/main/java/fr/miage/Transaction.java |  28 +++-
 src/main/java/fr/miage/UTxO.java        |  12 +-
 src/main/java/fr/miage/Wallet.java      | 165 ++++++++++++++++--------
 8 files changed, 197 insertions(+), 84 deletions(-)

diff --git a/keystore.jks b/keystore.jks
index 4113915d016bb4e87cb93f1512cc2661b45a4271..82d03eec604254def7822df5a4565c03e67b1a8c 100644
GIT binary patch
delta 1946
zcmeAb=ogrvP=7nMCX#`HmBFBi<&Oam8<#d4BMYMzlOQ7_OB2hhiQR`b?2_%$2;p|U
z!!#o)L+=Xn-+jgH|E|aE4!*(_J-M&<?WdC={}*hFd~-)?+S<kUdLpDU{`WaqJj<AJ
zZWa5qumb6<HR0@G|8H-x*9}zfvYq=@_e~<F66byQOb@nm)hFwxCdIza`r)_#zw+XJ
z-R3U@f)<B1oRd<rcak|E`^jL--K^REEw+Ci9uSzm?&9I9Cb92ZKQRgATwEEz8&>PA
zI<Y8aPy2y}^G^-3_5XaZk=I$d<x2MNN!`gI#i{mNK7N={RGp`C%i_XWJ;m97?3EXv
zvkcc{*;~~Y=5?Zy^?m5S!uo*86PEwDX0n7igP~SswNY8sg1(vQSND8ab!cy!@2h3e
zM=F|?CP?k<HPh{%=6T``o5ll$3QmqN&VW7p{AWh(?0Iv&I8DfT*U59M_HYKgWH+5;
z^L3LR@7d<?o&@j4dfnvi6Gi2nZRg*vj82_Ybm-Ay2~mOXD^j0cI5_9AQs?~X^-VKY
zM22tgVS3|p-QG0y{Uwp>$_q}+@)hNo`RYd^%j3K)&Fr%eIHvr6duj$l&1%O-VFy2N
zIIyIOxlAwU#in<^&YfNtIWN0zn%$>Lv6Z|r!B+y=TVnked;AdnEN;2XXyK;F{yY26
z20z-luqgh+uBq?N+dW?AZPY4ZZR@yI$K|+cedX(S6G9(1cZxo2Nu0BVnd#51`jxJU
zle`%InmGtdd|~iw)#+_3dzxuyJmW{!IqS($S{v2{J#P4_JnM~ACa3q}oJ@8rZJ}l#
z3)AVgR~}pyo%eCqfuw~w5+bF#3hul7Yq#7;i3?eC`0d@PxAtc}*mF+jAn&#iJ#%|~
z*-IC<RXnZt;<kG(*CM+i$y0Ih@1?(Mo+M`+Gb^ijopUVuM9XYRt0mkilM*MKRTTTD
z{9uC;<1M4)Zy&#{*sxXSfDnspE7#&F{g-r{&nT{R`Tc9V{fs;2S+x^C9KApDXXi<)
z6;me)%vzfCP44T;+{X*_*N0_SoGzHXqoJ<2-oR;}>&{2H>$~bJ*uExj-|d{TK)~(U
z9GAtcmk(Tc&l6QqFh%I`&HPLLVjNd$)&6ii+PHe5zuEeqmv3rozc=iSIoRUP9XFq2
z#kZ>*;mt>Q_q;ab5j>#&tFQEi&V+fF|1ip3bQEiojjEk;bwknpUa#{fHviH%v-j49
zORV?4q-OW=-Tccm|NFCT-sbhW-|qf;E%nuMa`&TI0eT9z9CzrMRex}}?(^J5dTaXe
z`Ic`M&s2P1Tl~YYdqHc0*QJkfa%Ieuw+Us4J+0?unYiG0{?pkN2^aXJj!l1Qd!Qho
z*2m=Ym5c}N9lw~g_L=Op5>P(2vLokMZZ7l2mZ>xMZ!zXrRK9;fvBIJa5%mSvyz6rg
zyuI)zuD9^Wo7Z~{g>K4(ze}jpyv({}?Zu)?_u@m>?QfnNSaJLE>?7OV7wl$v%Dh7E
z;Lr1mB1_NhKm2(9<)zD`8Ro56!~2iT{KyAootY2Tm~X!}CHTMf-yd3sVs8CunE55X
zYkOAqp_F7>yQ)aVUDK{M^t@ZREwR76lwnCrX@0#&wb#bfm7?3$%ZQ1F)K&KHciS25
zcGOXJMy_3L3+F|{8%yoiY>-md$e6*HJ-z70gy`KXdQ_V{GX?G)=+T_G)9_utrhvv`
z74Gd9IkpF7&R7=d?iL&?&|&o9@aNNF%zM6@_VHZOvEOt3`QEC`&27nF{@Rq!jQN-G
zb*8YMEpN&-A=l%(?7v-~Q2BphcWU>X^(^;=CabZ^b1Yr|<5N6a?X=0htQuk_hQ_8Q
z#^zDtyhf%5Mn=XE?&NM(qxx-%CuTk}s?cezPE_^k%lOr4%A9V+q2?3%OL@||&DT74
zRbQC>ZSl33R@<CFJK-JKj#mz|c1y0zw&`<t<~cX#$8l9o=4Y?w&wi9!av_6#3m2Qi
zk=pO4u5S_HPtw|-mr`(L%7<Jd+dp$>pDtLSRos60Z%LT`!hP3gw#2qeTv0ewzw$5l
z7nfqERYLC_c7N&Jx}b>BEHtcq;hGie9@Q?N7~S2sG%f7M?B!>yCtuY2lG3ZW)}&i(
z!=8_luBV>sn(qmj^dPEmvd+3$n~y(UdeC~e^Y!y*A|vNa&6r=FTfF}F+U@qUk2X9$
zX)o>3Al;dKGCHz#UANN`_5v<0`?FDM%XOC2Pq$}cW@KPotY{!_Aj`%aD$B<r#v)?D
zE^=(SSLb98&e&^#KXZF?wsX!j;AP{~YV&CO&dbQi!^*(i#K_3N9~vc`;HzW2_t25U
z*Cp@IeHGHC?V6{W`E<fnV?*uo+v~hrxB5jYKa<csc<AZ0M{?UOKi^sY`lf%Gxlz;W
zgja!E>t8MZHCJU;@}%nr^Ea%Wbn?W*?&if)!{=q?oU^v}Qs3U&9sOg)1no)}%ZLkA
zKkrTmoxJJxjUu_bQ~pXxYApS-OW68j=%0&1&0c}KZY?VK`yf#DX}_Xmk<9!LJ6~?j
zU2<@W`UeiHyQ%)#Hm$#o1*^XOTK!ti>;3JpO*5X{{ik;8Xh`UX>lfE}wf`vjF#p<d
zKR54<?3xX6j$K?oN<KXgxh?a%SxS#hxrwK93lGQReXARz`({@NhN~WPx^IzsK#axd
a@W=Fe`*q^}zWrZTzRk20+0}gH`cnWA@4rU?

delta 1944
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
U#UxjH)2vrcoTU@8<ys~I0E!x+2mk;8

diff --git a/src/main/java/fr/miage/App.java b/src/main/java/fr/miage/App.java
index c0f3673..14560e4 100644
--- a/src/main/java/fr/miage/App.java
+++ b/src/main/java/fr/miage/App.java
@@ -15,14 +15,14 @@ public class App {
     public static void main(String[] args) throws NoSuchAlgorithmException, InterruptedException {
         System.out.println("Début de la blockchain");
         // Création de 2 wallets
-        Wallet bobWallet = new Wallet("jesuislacleprivedebob", "bob");
-        Wallet aliceWallet = new Wallet("je suis la clé privé de alice", "alice");
+        Wallet bobWallet = new Wallet("bob");
+        Wallet aliceWallet = new Wallet("alice");
 
         List<Wallet> wallets = Arrays.asList(bobWallet, aliceWallet);
         Blockchain blockchain = new Blockchain("BloBlockchain", wallets);
 
-        System.out.println("Wallet de bob : " + bobWallet.getUtxos());
-        System.out.println("Wallet de alice : " + aliceWallet.getUtxos());
+        // System.out.println("Wallet de bob : " + bobWallet.getUtxos());
+        // System.out.println("Wallet de alice : " + aliceWallet.getUtxos());
         // System.out.println("Utxos du wallet de bob : " + bobWallet.getUtxos());
         // System.out.println("Utxos du wallet de alice : " + aliceWallet.getUtxos());
         // Transaction transaction = new Transaction(bobWallet, aliceWallet, 2,
@@ -38,7 +38,8 @@ public class App {
             blockchain.createTrasaction();
             i++;
         }
-        System.out.println("Transactions pool count : " + blockchain.transactionsPool.size());
+        System.out.println("Transactions pool count : " +
+                blockchain.transactionsPool.size());
 
         // // print all utxo in the utxo set
         // for (UTxO utxo : Blockchain.utxos) {
diff --git a/src/main/java/fr/miage/Bloc.java b/src/main/java/fr/miage/Bloc.java
index f0a5a42..2b941f9 100644
--- a/src/main/java/fr/miage/Bloc.java
+++ b/src/main/java/fr/miage/Bloc.java
@@ -51,7 +51,7 @@ public class Bloc {
         List<Transaction> transactions = new ArrayList<Transaction>();
         for (Wallet wallet : wallets) {
             int amount = RandomNumberGenerator.getRandomNumber(1, 20);
-            UTxO utxo = new UTxO(null, wallet.getPublicKey(), amount);
+            UTxO utxo = new UTxO(null, wallet.getKeyPair().getPublic(), amount);
             wallet.addUTxO(utxo);
             Blockchain.utxos.add(utxo);
             List<UTxO> utxos = new ArrayList<UTxO>() {
@@ -60,10 +60,10 @@ public class Bloc {
                 }
             };
 
-            Coinbase coinbase = new Coinbase(utxos, wallet.getPublicKey(), EnumTypeTransaction.COINBASE);
+            Coinbase coinbase = new Coinbase(utxos, wallet.getKeyPair().getPublic(), EnumTypeTransaction.COINBASE);
             transactions.add(coinbase);
         }
-        System.out.println("Set UTxO INITIAL " + Blockchain.utxos);
+        // System.out.println("Set UTxO INITIAL " + Blockchain.utxos);
 
         BlocHeader blocHeader = new BlocHeader("", Instant.now().toEpochMilli(), 0);
         String header = blocHeader.toString();
diff --git a/src/main/java/fr/miage/Blockchain.java b/src/main/java/fr/miage/Blockchain.java
index bab320c..4cc5db7 100644
--- a/src/main/java/fr/miage/Blockchain.java
+++ b/src/main/java/fr/miage/Blockchain.java
@@ -1,5 +1,11 @@
 package fr.miage;
 
+import java.security.InvalidKeyException;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
@@ -42,22 +48,56 @@ public class Blockchain {
 
         double amountWalletSender = walletSender.getUtxos().stream().mapToDouble(utxo -> utxo.getMontant()).sum();
         double randomAmountToSend = new Random().nextDouble(amountWalletSender);
-        System.out.println("Amount to send : " + randomAmountToSend);
-        System.out.println("Envoie de " + walletSender.getName() + " à " + walletReceiver.getName());
-        System.out.println();
-        System.out.println("Utxos de " + walletSender.getName() + " : " + walletSender.getUtxos());
-        System.out.println("Utxos de " + walletReceiver.getName() + " : " + walletReceiver.getUtxos());
-        System.out.println();
+        // System.out.println("Amount to send : " + randomAmountToSend);
+        // System.out.println("Envoie de " + walletSender.getName() + " à " +
+        // walletReceiver.getName());
+        // System.out.println();
+        // System.out.println("Utxos de " + walletSender.getName() + " : " +
+        // walletSender.getUtxos());
+        // System.out.println("Utxos de " + walletReceiver.getName() + " : " +
+        // walletReceiver.getUtxos());
+        // System.out.println();
         if (walletSender.getUtxos().isEmpty() || walletReceiver.getUtxos().isEmpty()) {
             System.out.println("Wallets vides");
             return;
         }
 
         Transaction tx = new Transaction(walletSender, walletReceiver, randomAmountToSend, EnumTypeTransaction.NORMAL);
-
+        String transactionData = getTransactionData(tx);
+        try {
+            byte[] signature = sign(transactionData, walletSender.getKeyPair().getPrivate());
+            tx.setSignature(signature);
+            if (verifySignature(transactionData, signature, walletSender.getKeyPair().getPublic())) {
+                System.out.println("Signature vérifiée");
+            } else {
+                System.out.println("Signature non vérifiée");
+            }
+        } catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
+            e.printStackTrace();
+        }
         this.transactionsPool.add(tx);
     }
 
+    public String getTransactionData(Transaction tx) {
+        return tx.getInputs().toString() + tx.getOutputs().toString() + tx.getId();
+    }
+
+    public byte[] sign(String data, PrivateKey privateKey)
+            throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+        Signature signature = Signature.getInstance("SHA256withRSA");
+        signature.initSign(privateKey);
+        signature.update(data.getBytes());
+        return signature.sign();
+    }
+
+    public boolean verifySignature(String data, byte[] signature, PublicKey publicKey)
+            throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
+        Signature sign = Signature.getInstance("SHA256withRSA");
+        sign.initVerify(publicKey);
+        sign.update(data.getBytes());
+        return sign.verify(signature);
+    }
+
     public Wallet selectWallet(List<Wallet> wallets) {
         if (wallets.size() == 0) {
             return null;
diff --git a/src/main/java/fr/miage/Coinbase.java b/src/main/java/fr/miage/Coinbase.java
index 1f2ab8f..4a82739 100644
--- a/src/main/java/fr/miage/Coinbase.java
+++ b/src/main/java/fr/miage/Coinbase.java
@@ -1,14 +1,15 @@
 package fr.miage;
 
+import java.security.PublicKey;
 import java.util.ArrayList;
 import java.util.List;
 
 public class Coinbase extends Transaction {
-    public Coinbase(List<UTxO> inputs, List<UTxO> outputs, String signature, EnumTypeTransaction typeTransaction) {
+    public Coinbase(List<UTxO> inputs, List<UTxO> outputs, PublicKey signature, EnumTypeTransaction typeTransaction) {
         super(inputs, outputs, signature, EnumTypeTransaction.COINBASE);
     }
 
-    public Coinbase(List<UTxO> outputs, String signature, EnumTypeTransaction typeTransaction) {
+    public Coinbase(List<UTxO> outputs, PublicKey signature, EnumTypeTransaction typeTransaction) {
         super(new ArrayList<UTxO>(), outputs, signature, EnumTypeTransaction.COINBASE);
     }
 }
diff --git a/src/main/java/fr/miage/Transaction.java b/src/main/java/fr/miage/Transaction.java
index 4835dcd..fa4b91c 100644
--- a/src/main/java/fr/miage/Transaction.java
+++ b/src/main/java/fr/miage/Transaction.java
@@ -2,6 +2,7 @@ package fr.miage;
 
 import java.security.NoSuchAlgorithmException;
 import java.security.PrivateKey;
+import java.security.PublicKey;
 import java.security.Signature;
 import java.util.Arrays;
 import java.util.List;
@@ -15,8 +16,10 @@ public class Transaction {
     private List<UTxO> inputs;
     private List<UTxO> outputs;
     private EnumTypeTransaction typeTransaction;
+    private byte[] signature;
 
-    public Transaction(List<UTxO> inputs, List<UTxO> outputs, String signature, EnumTypeTransaction typeTransaction) {
+    public Transaction(List<UTxO> inputs, List<UTxO> outputs, PublicKey PublicKey,
+            EnumTypeTransaction typeTransaction) {
         this.inputs = inputs;
         this.outputs = outputs;
         this.typeTransaction = typeTransaction;
@@ -33,12 +36,13 @@ public class Transaction {
                 this.receiver = receiver;
                 this.typeTransaction = typeTransaction.NORMAL;
                 this.id = UUID.randomUUID();
-                UTxO utxoAmount = new UTxO(this.id, receiver.getPublicKey(), amount); // peut
-                                                                                      // etre
+                UTxO utxoAmount = new UTxO(this.id, receiver.getKeyPair().getPublic(), amount); // peut
+                // etre
                 // changr par
                 // amout
                 this.receiver.addUTxO(utxoAmount);
-                UTxO utxoRest = new UTxO(this.id, sender.getPublicKey(), getTotalAmountUtxoInput(inputs) - amount);
+                UTxO utxoRest = new UTxO(this.id, sender.getKeyPair().getPublic(),
+                        getTotalAmountUtxoInput(inputs) - amount);
                 this.sender.addUTxO(utxoRest);
                 this.outputs = Arrays.asList(utxoAmount, utxoRest);
                 Blockchain.utxos.addAll(this.outputs);
@@ -94,6 +98,22 @@ public class Transaction {
         return this.typeTransaction;
     }
 
+    public Wallet getReceiver() {
+        return receiver;
+    }
+
+    public Wallet getSender() {
+        return sender;
+    }
+
+    public byte[] getSignature() {
+        return signature;
+    }
+
+    public void setSignature(byte[] signature) {
+        this.signature = signature;
+    }
+
     @Override
     public String toString() {
         return "{" +
diff --git a/src/main/java/fr/miage/UTxO.java b/src/main/java/fr/miage/UTxO.java
index 626101d..c4884a3 100644
--- a/src/main/java/fr/miage/UTxO.java
+++ b/src/main/java/fr/miage/UTxO.java
@@ -1,32 +1,32 @@
 package fr.miage;
 
+import java.security.PublicKey;
 import java.util.UUID;
 
 public class UTxO implements Comparable {
-    //UTXO : Hash qui renvoie a la transaction d'avant
+    // UTXO : Hash qui renvoie a la transaction d'avant
     private UUID uuid; // identifiant (transaction de provenances)
-    private String ownerAdresss; // clé publique du wallet
+    private PublicKey ownerAdresss; // clé publique du wallet
     private double montant;
 
-    public UTxO(UUID provenance, String ownerAdresss, double montant) {
+    public UTxO(UUID provenance, PublicKey ownerAdresss, double montant) {
         this.uuid = provenance;
         this.ownerAdresss = ownerAdresss;
         this.montant = montant;
     }
 
-    public String ownerAdress() {
+    public PublicKey ownerAdress() {
         return this.ownerAdresss;
     }
 
     public double getMontant() {
         return this.montant;
     }
+
     public UUID getUuid() {
         return uuid;
     }
 
-
-
     @Override
     public String toString() {
         return "UTxO [uuid=" + uuid + ", ownerAdress=" + ownerAdresss + ", montant=" + montant + "]";
diff --git a/src/main/java/fr/miage/Wallet.java b/src/main/java/fr/miage/Wallet.java
index 17f6e85..034f0be 100644
--- a/src/main/java/fr/miage/Wallet.java
+++ b/src/main/java/fr/miage/Wallet.java
@@ -1,70 +1,87 @@
 package fr.miage;
 
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.charset.StandardCharsets;
+import java.security.InvalidKeyException;
+import java.security.KeyPair;
+import java.security.KeyPairGenerator;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
 public class Wallet {
-    private String publicKey;
-    private String privateKey; // pour la signature
+    // private PublicKey publicKey;
+    // private PrivateKey privateKey; // pour la signature
+    private KeyPair keyPair;
     private double solde;
     private List<UTxO> utxos;
     private String name; // temp
 
-    public Wallet(String privateKey, String name) throws NoSuchAlgorithmException, InterruptedException {
+    public Wallet(String name) throws NoSuchAlgorithmException, InterruptedException {
         this.name = name;
-        this.privateKey = privateKey;
-        initWallet();
-        createKeyPair(privateKey, name);
+        this.keyPair = generateKeyPair();
+        this.utxos = new ArrayList<UTxO>();
     }
 
-    public void initWallet() throws NoSuchAlgorithmException {
-        this.publicKey = hashSha256(this.privateKey);
-        this.utxos = new ArrayList<>();
-    }
-
-    public void createKeyPair(String privateKey, String name) throws InterruptedException {
-
-        String command = "keytool -genkeypair -alias wallet_" + name + " -keyalg RSA -keysize 2048 -dname \"CN=" + name
-                + "\" -validity 365 -storetype JKS -keystore keystore.jks -storepass \"" + privateKey + "\"";
-
-        System.out.println(command);
-        ProcessBuilder processBuilder = new ProcessBuilder(command.split("\\s+"));
-        processBuilder.redirectErrorStream(true);
-        // try {
-        // // Process process = processBuilder.start();
-        // // OutputStream outputStream = process.getOutputStream();
-        // // outputStream.write("\n".getBytes(StandardCharsets.UTF_8));
-        // // outputStream.flush();
-        // // outputStream.close();
-
-        // // InputStream inputStream = process.getInputStream();
-        // // InputStream errorStream = process.getErrorStream();
-
-        // // byte[] buffer = new byte[1024];
-        // // int bytesRead;
-
-        // // while ((bytesRead = inputStream.read(buffer)) != -1) {
-        // // System.out.write(buffer, 0, bytesRead);
-        // // }
-
-        // // while ((bytesRead = errorStream.read(buffer)) != -1) {
-        // // System.err.write(buffer, 0, bytesRead);
-
-        // }
-        // }catch(
-
-        // IOException e)
-        // {
-        // e.printStackTrace();
-        System.out.println("Erreur lors de la création du keypair");
-        System.out.println("Le wallet de " + name + " a été créé avec succès");
+    // public void initWallet() throws NoSuchAlgorithmException {
+    // this.publicKey = hashSha256(this.privateKey);
+    // this.utxos = new ArrayList<>();
+    // }
+
+    // public void createKeyPair(String privateKey, String name) throws
+    // InterruptedException {
+
+    // String command = "keytool -genkeypair -alias wallet_" + name + " -keyalg RSA
+    // -keysize 2048 -dname \"CN=" + name
+    // + "\" -validity 365 -storetype JKS -keystore keystore.jks -storepass \"" +
+    // privateKey + "\"";
+
+    // System.out.println(command);
+    // ProcessBuilder processBuilder = new ProcessBuilder(command.split("\\s+"));
+    // processBuilder.redirectErrorStream(true);
+    // try {
+    // Process process = processBuilder.start();
+    // OutputStream outputStream = process.getOutputStream();
+    // outputStream.write("\n".getBytes(StandardCharsets.UTF_8));
+    // outputStream.flush();
+    // outputStream.close();
+    // InputStream inputStream = process.getInputStream();
+    // InputStream errorStream = process.getErrorStream();
+    // byte[] buffer = new byte[1024];
+    // int bytesRead;
+    // while ((bytesRead = inputStream.read(buffer)) != -1) {
+    // System.out.write(buffer, 0, bytesRead);
+    // }
+    // while ((bytesRead = errorStream.read(buffer)) != -1) {
+    // System.err.write(buffer, 0, bytesRead);
+
+    // }
+    // } catch (IOException e) {
+    // e.printStackTrace();
+    // System.out.println("Erreur lors de la création du keypair");
+    // }
+    // System.out.println("Le wallet de " + name + " a été créé avec succès");
+    // }
+
+    public KeyPair generateKeyPair() throws NoSuchAlgorithmException {
+        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
+        keyPairGenerator.initialize(2048);
+        KeyPair keyPair = keyPairGenerator.generateKeyPair();
+        return keyPair;
     }
 
     private String hashSha256(String privateKey) throws NoSuchAlgorithmException {
@@ -97,10 +114,39 @@ public class Wallet {
 
     }
 
-    public String getPublicKey() {
-        return this.publicKey;
+    public void loadPrivateKey() throws UnrecoverableKeyException, KeyStoreException, NoSuchAlgorithmException,
+            CertificateException, FileNotFoundException, IOException {
+        KeyStore keyStore = KeyStore.getInstance("JKS");
+        keyStore.load(new FileInputStream("keystore.jks"), null); // replace null by privateKey
+        PrivateKey privateKey = (PrivateKey) keyStore.getKey("wallet_" + this.name, null); // replace null by //
+                                                                                           // privateKey// // (password)
     }
 
+    // public void publishPublicKey() {
+    // String command = "keytool -exportcert -alias wallet_" + name
+    // + " -storetype JKS -keystore keystore.jks -file certificate.cer -rfc
+    // -storepass \"" + privateKey + "\"";
+    // System.out.println(command);
+    // ProcessBuilder processBuilder = new ProcessBuilder(command.split("\\s+"));
+    // try {
+    // Process process = processBuilder.start();
+    // } catch (IOException e) {
+    // e.printStackTrace();
+    // System.out.println("Erreur lors de la publication de la clé publique");
+    // }
+    // }
+
+    // public void loadPublicKeyForVerification() {
+    // String command = "keytool -exportcert -alias wallet_" + name
+    // + " -storetype JKS -keystore keystore.jks -file certificate.cer -rfc
+    // -storepass \"" + privateKey + "\"";
+
+    // }
+
+    // public String getPublicKey() {
+    // return this.publicKey;
+    // }
+
     public String getName() {
         return name;
     }
@@ -109,9 +155,9 @@ public class Wallet {
         this.name = name;
     }
 
-    public String getPrivateKey() {
-        return this.privateKey;
-    }
+    // public String getPrivateKey() {
+    // return this.privateKey;
+    // }
 
     public List<UTxO> getUtxos() {
         return this.utxos;
@@ -123,10 +169,15 @@ public class Wallet {
 
     @Override
     public String toString() {
-        return "{" +
-                " publicKey='" + getPublicKey() + "'" +
-                ", privateKey='" + getPrivateKey() + "'" +
-                ", utxos='" + getUtxos() + "'" +
-                "}";
+        return "Wallet [keyPair=" + keyPair + ", solde=" + solde + ", utxos=" + utxos + ", name=" + name + "]";
+    }
+
+    public KeyPair getKeyPair() {
+        return keyPair;
+    }
+
+    public void setKeyPair(KeyPair keyPair) {
+        this.keyPair = keyPair;
     }
+
 }
-- 
GitLab