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 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 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