Skip to content
Snippets Groups Projects
Commit 2cc94e66 authored by saintdi25u's avatar saintdi25u
Browse files

refacto + mise en place d'une mauvaise signature

parent 8d96a233
No related branches found
No related tags found
1 merge request!2refacto: Update README
......@@ -45,7 +45,7 @@ public class Blockchain {
// Permet de créer une transaction avec deux wallets aléatoire et de l'ajouter
// dans la transaction pool;
public void createTransaction() {
public void createTransaction() throws InterruptedException {
List<Wallet> walletsCopy = new ArrayList<>();
walletsCopy.addAll(wallets);
Wallet walletSender = selectWallet(walletsCopy);
......@@ -58,21 +58,33 @@ public class Blockchain {
System.out.println("Wallets vides");
return;
}
System.out.println("[TRANSACTION] --- Création d'une transaction =========================================\n");
System.out.println(" " + walletSender.getName() + " envoie " + randomAmountToSend + " à "
+ walletReceiver.getName() + "\n");
Transaction tx = new Transaction(walletSender, walletReceiver, randomAmountToSend, EnumTypeTransaction.NORMAL);
Transaction tx = new Transaction(walletSender, walletReceiver, EnumTypeTransaction.NORMAL);
tx.putUTxO(walletSender, walletReceiver, randomAmountToSend);
Blockchain.utxos.addAll(tx.getOutputs());
Blockchain.utxos.removeAll(tx.getInputs());
String transactionData = getTransactionData(tx);
try {
byte[] signature = sign(transactionData, walletSender.getKeyPair().getPrivate());
System.out.println("[SIGNATURE] --- Signature de la transaction : " + signature);
tx.setSignature(signature);
if (verifySignature(transactionData, signature, walletSender.getKeyPair().getPublic())) {
if (makeFakeSign()) {
Wallet fakeWallet = new Wallet("FakeWallet");
tx.sign(transactionData, fakeWallet.getKeyPair().getPrivate());
} else {
tx.sign(transactionData, walletSender.getKeyPair().getPrivate());
}
System.out.println("[SIGNATURE] --- Signature de la transaction : " + tx.getSignature());
if (tx.verifySignature(transactionData, walletSender.getKeyPair().getPublic())) {
System.out.println("[SIGNATURE] --- Signature vérifiée");
Blockchain.transactionsPool.add(tx);
} else {
System.out.println("[SIGNATURE] --- Signature non valide : TRANSACTION REJETEE");
Blockchain.utxos.removeAll(tx.getOutputs());
Blockchain.utxos.addAll(tx.getInputs());
return;
}
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException e) {
e.printStackTrace();
......@@ -84,21 +96,10 @@ public class Blockchain {
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());
System.out.println("[SIGNATURE] --- Vérification de la signature : " + signature.toString());
return sign.verify(signature);
public boolean makeFakeSign() {
int num1 = (int) (Math.random() * 5) + 1;
int num2 = (int) (Math.random() * 5) + 1;
return num1 == num2;
}
public Wallet selectWallet(List<Wallet> wallets) {
......@@ -118,7 +119,6 @@ public class Blockchain {
i++;
}
return null;
}
public void addBloc(Bloc bloc) {
......
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.Arrays;
import java.util.List;
import java.util.UUID;
......@@ -22,35 +27,44 @@ public class Transaction {
this.id = UUID.randomUUID();
}
public Transaction(Wallet sender, Wallet receiver, double amount, EnumTypeTransaction typeTransaction) {
public Transaction(Wallet sender, Wallet receiver, EnumTypeTransaction typeTransaction) {
this.sender = sender;
this.receiver = receiver;
this.typeTransaction = typeTransaction.NORMAL;
this.id = UUID.randomUUID();
}
public void putUTxO(Wallet sender, Wallet receiver, double amount) {
this.inputs = sender.getUTxOsForTransaction(amount);
// System.out.println("Inputs : " + this.inputs);
// System.out.println("Set UTxO : " + Blockchain.utxos);
if (inputs != null) {
if (isValidTransaction(inputs)) {
this.sender = sender;
this.receiver = receiver;
this.typeTransaction = typeTransaction.NORMAL;
this.id = UUID.randomUUID();
UTxO utxoAmount = new UTxO(this.id, UUID.randomUUID(), receiver.getKeyPair().getPublic(), amount);
this.receiver.addUTxO(utxoAmount);
UTxO utxoRest = new UTxO(this.id, UUID.randomUUID(), sender.getKeyPair().getPublic(),
getTotalAmountUtxoInput(inputs) - amount);
this.sender.addUTxO(utxoRest);
this.outputs = Arrays.asList(utxoAmount, utxoRest);
for (UTxO utxo : this.inputs) {
Blockchain.utxos.add(utxo);
}
Blockchain.utxos.addAll(this.outputs);
printUtxoDetails(inputs, outputs);
} else {
System.err.println("Transaction invalide, utxo absent");
}
} else {
System.out.println("Solde insuffisant");
UTxO utxoAmount = new UTxO(this.id, UUID.randomUUID(), receiver.getKeyPair().getPublic(), amount);
this.receiver.addUTxO(utxoAmount);
UTxO utxoRest = new UTxO(this.id, UUID.randomUUID(), sender.getKeyPair().getPublic(),
getTotalAmountUtxoInput(inputs) - amount);
this.sender.addUTxO(utxoRest);
this.outputs = Arrays.asList(utxoAmount, utxoRest);
for (UTxO utxo : this.inputs) {
Blockchain.utxos.add(utxo);
}
Blockchain.utxos.removeAll(this.inputs);
printUtxoDetails(inputs, outputs);
}
public void sign(String data, PrivateKey privateKey)
throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data.getBytes());
this.signature = signature.sign();
}
public boolean verifySignature(String data, PublicKey publicKey)
throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initVerify(publicKey);
sign.update(data.getBytes());
System.out.println("[SIGNATURE] --- Vérification de la signature : " + signature.toString());
return sign.verify(signature);
}
public void printUtxoDetails(List<UTxO> inputs, List<UTxO> outputs) {
......
......@@ -15,7 +15,12 @@ public class TransactionCreator extends Thread {
public void run() {
while (true) {
blockchain.createTransaction();
try {
blockchain.createTransaction();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(
"[POOL] Nombre de transaction dans la pool : " + Blockchain.transactionsPool.size() + "\n");
try {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment