4. Crearea unui portofel virtual

O tranzacție de criptomonede reprezintă transferul proprietății unui număr de unități sau fracții de monedă de la o persoana către altă persoană. Pentru a realiza o astfel de tranzacție, trebuie să știm portofelul de unde pleacă monedele și cel unde ajung – practic să știm o adresă a fiecăruia. Un portofel virtual, în forma sa cea mai simplă, este doar o adresă unică.

Pentru a realiza tranzacția, vom folosi o preche de chei (publică și privată) – vom folosi criptografia asimetrică.

Această pereche, garantată de matematica specifică ca fiind sigură are unele proprități deosebite: ce este semnat  cu cheia privată poate fi verificat cu cheia publică si ce este criptat cu cheia publică poate fi decriptat doar cu cheia privată. Astfel cheia publică poate fi cunoscută de oricine – atăta timp cat cheia privată ramâne secretă se poate asigura o comunicare sigură.

În concluzie, pentru a realiza tranzacții, vom avea nevoie de un portofel care să conțină o pereche de chei public – privat. Vom folosi o cheie publică pentru adresa portofelului nostru la care însă vom adăuga o cheie privată pentru a fi siguri că nimeni nu ne va modifica tranzacția o dată ce o vom transmite.

Astfel în tranzacție voi trimite adresa portofelului meu (care a aceeași cu cheia mea publică în exemplul nostru), adresa portofelului unde vreau să ajungă transferul, valoarea transferului  și o semnătură realizată cu cheia mea privată. Oricine poate verifica dacă datele sunt semnate intr-adevăr de mine (verificare în care e utilizată cheia mea publică) și că nu au fost modificate de la semnare.

Haideți sa adăugăm o noua clasă în proiectul nostru = Wallet:

 
import java.security.PrivateKey;
import java.security.PublicKey;

public class Wallet {

    public PrivateKey privateKey;
    public PublicKey publicKey;
}

Chiar pe constuctorul de la Wallet vom genera perechea de chei, folosind biblioteca de criptografie de la Bouncy Castle.

Vom adăuga in classpath bcprov-jdk15on-151.jar (sau o versiune similară). Funcția pe care o vom folosi la generarea perechii de chei este cea de mai jos

 
 private void generateKeyPair() {
        try {
            //alegem algoritmul elliptic curve = curbe eliptice si providerul Bocuncy Castle= BC
            KeyPairGenerator keyGen = KeyPairGenerator.getInstance("ECDSA", "BC");
            //alegem celelalte setari necesar- pentru exemplul nostru nu vom intra in amanunte
            SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
            ECGenParameterSpec ecSpec = new ECGenParameterSpec("prime192v1");
            // Intitializam generatorul si generam cheile
            keyGen.initialize(ecSpec, random);
            KeyPair keyPair = keyGen.generateKeyPair();
            // Setam cheia publica si cheia privata a portofelului
            privateKey = keyPair.getPrivate();
            publicKey = keyPair.getPublic();
        } catch (Exception e) {
            //in exemplul acesta nu tratam exceptia, totusi o scriem ca sa fim siguri ca nu apare o eroare
            System.out.println("eroare generare chei=" + e.toString());
        }
    }

În final adăugăm pe constructor funcția, împreună cu adăugarea providerului Bouncy Castle și System.out prntru vizualizarea ulterioară.

Notă: în mod normal toate vizualizările/ verificările ar trebui să foloseasca test units (de exemplu cu JUnit), dar deoarece am încercat să prezint cât mai clar și pe întelesul tuturor, am ales sa folosesc System.out.print dintr-un main.

 
    public Wallet() {
        Security.addProvider(new BouncyCastleProvider());
        generateKeyPair();
        System.out.println("publicKey=" + publicKey.toString());
        System.out.println("privateKey=" + privateKey.toString());
    }

Dacă în main declarăm un obiect de tip Wallet

 
    public static void main(String[] args) {
        Wallet w=new Wallet();
.........

Se vor afișa cheile generate – de exemplu la mine:

publicKey=EC Public Key
X: df5224ae74a2d2f84c69d8e8cf4856d6364eb2a9fc87d6
Y: e275baa8c2709b2fe10dd794f3f3a3d0d409690fb4c5106e

privateKey=EC Private Key
S: 8ee2908a18ab2a83d4a0a55e79581db3505750919f67ff26

5. Tranzacții și semnături

Comentariile nu sunt permise.