Sunteți pe pagina 1din 6

Ministerul Educaţiei Republicii Moldova

Universitatea Tehnică a Moldovei


Facultatea de Calculatoare, Informatică şi Microelectronică
Catedra Automatică şi Tennologii Informaţionale

Raport
Lucrare de laborator nr.4
La disciplina: Securitatea informationala
Tema: “Canal virtual sigur”

A efectuat:

A verificat

Chişinău 2014
Scopul si obiectivele lucrarii:
De implementat o aplicatie chat securizat.
De utilizat algorimii pentru criptare la alegere:
a) DES
b) RSA
si algoritmul pentru distribuirea cheilor simetrice Diffie-Hellman.

1.1 Algoritmul de criptare simetric DES


Tehnica de criptare DES (Data Encryption Standard) a apărut î n anii '70 î n
Statele Unite ale Americii. Standardul de criptare a fost realizat de Biroul Naional
de Standardizare (National Bureau of Standards) cu ajutorul Agenţ iei Naţ ionale de
Securitate (National Security Agency). Această tehnică de criptare este una dintre
cele mai utilizate. Scopul acestei tehnici este acela de a asigura o metodă standard
pentru protejarea datelor comerciale neclasificate. IBM a creat î n anul 1976 o primă
implementare a algoritmului sub numele de Lucifer.

1.2 Distribuirea cheilor simetrice Diffie-Hellman


Aacordul Diffie-Hellman asupra cheilor a fost prima solutie practica la problema
distributiei cheilor care a permis celor doua parti sa partajeze un secret fara a
cunoaste a priori o alta informatie, pe un canal deschis A si B trimit cate un mesaj
peste un canal deschis, la final A si B partajeaza secretul K.
1. Pas premergator, o singura data se selecteaza un numar prim p si un
generator α al lui Zp* si se publica
2. Mesaje:
a) A → B: αx mod p
b) A ← B: αy mod p
3. Actiuni:
a) A selecteaza aleator un secret x, 1 ≦x ≦p-2 si trimite lui B
b) B selecteaza aleator un secret x, 1 ≦x ≦p-2 si trimite lui A
c) B calculeaza K = (αx)y mod p
d) A calculeaza K = (αy)x mod p
Efectuarea lucrarii:

1.1 Diagrama claselor

Figura 1 – Diagrama claselor


1.2 Interfața grafică

Figura 2 – Fereastra de întîmpinare


Figura 3 – Interfața Chat propriuzisă

1.3 Distribuirea cheilor simetrice Diffie-Hellman


Mai întîi are loc generarea parametrilor P și G cu care trebuie de ajuns la un
consens cu al 2-lea participant la înțelegere.

AlgorithmParameterGenerator paramGen =
AlgorithmParameterGenerator.getInstance("DH");
paramGen.init(1024);

AlgorithmParameters params = paramGen.generateParameters();


DHParameterSpec dhSpec =
params.getParameterSpec(DHParameterSpec.class);

System.out.println("[INFO] Server | P: " + dhSpec.getP());


System.out.println("[INFO] Server | G: " + dhSpec.getG());
După ce au fost generați parametrii P și G îi trimitem printr-un socket către al 2-lea
participant la conversație:
oos.writeObject(dhSpec.getP());
oos.writeObject(dhSpec.getG());

Inițializăm algoritmul DH folosind cheia privată ce ne aparține:


KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DH");
keyGen.initialize(dhSpec, new SecureRandom());
KeyAgreement keyAgree = KeyAgreement.getInstance("DH");
KeyPair keyPair = keyGen.generateKeyPair();

keyAgree.init(keyPair.getPrivate());

Și în acelaș timp trimitem cheia publică către al 2-lea participant:


System.out.println("[INFO] Server | Switching Public Keys with
Client");
oos.writeObject(keyPair.getPublic());
Fiindcă al 2-lea participant urmărește aceeași pași noi trebuie să primim de la el
cheia publică trimisă de el:

PublicKey clientPublicKey = (PublicKey) ois.readObject();

La acest pas avem parametrii P și G generați inițial, cheia privată ce ne


aparține și cheia publică de la al 2-lea participant putem calculă shared secret care
ulterior va fi folosit pentru criptarea conversației cu algoritmul DES.
keyAgree.doPhase(clientPublicKey, true);
byte[] keyAgreeSecret = keyAgree.generateSecret();

1.4 Criptarea mesajelor folosind DES


Pentru a inițializa algoritmul DES folosim cheia obținută după aplicarea
algoritmului de distribuire a cheilor simetrice Diffie-Hellman. Deoare algoritmul
DES are nevoie de o cheie de lungime 64 biți vom folosi doar primii 8 octeți din
cheia secretă comună obținută în urma DH.
byte[] keyAgreeSecret = keyAgree.generateSecret();
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
byte[] bkey = Arrays.copyOf(sha256.digest(keyAgreeSecret), 8);

Deoarece chatul este un canal de comunicare intrare-ieșire avem nevoie de 2 canale


DES, unul pentru criptare și altul pentru decriptare:
Cipher ecipher = Cipher.getInstance("DES");
Cipher decipher = Cipher.getInstance("DES");
SecretKey secretKey = new SecretKeySpec(bkey, "DES");
ecipher.init(Cipher.ENCRYPT_MODE, secretKey);
decipher.init(Cipher.DECRYPT_MODE, secretKey);

Pentru a trimite un mesaj îl criptăm în felul următor:


msg = myUsername + ": " + msg;
byte[] benc = ecipher.doFinal(msg.getBytes("UTF-8"));
System.out.println("[INFO] Server Sending: " + new String(benc));

msg = new String(BASE64EncoderStream.encode(benc));

oos.writeObject(msg);
Pentru a recepționa mesajul trebuie să-l decriptăm și după să-l afișăm:
while (currentConnection.isConnected()) {
String msg = (String) ois.readObject();
byte[] enc = BASE64DecoderStream.decode(msg.getBytes());
byte[] dec = decipher.doFinal(enc);

msg = new String(dec);


chatWindow.addMessage(msg);
}

Concluzii
În cadrul acestei lucrari de laborator am studiat conceptele de criptare a
informației folosind algoritmi simetrici și chei publice, în acelaș timp am studiat cum
probleme din matematică sunt folosite în criptografie. Am folosit algoritmul de
distribuire a cheilor simetrice Diffie-Hellman.

S-ar putea să vă placă și