Commit 74e67e857ca7a1c038653e245a8deedcb2fc2594
1 parent
ec6251cd
Encryption code removed
Showing
12 changed files
with
32 additions
and
468 deletions
Makefile
1 | -CXXFLAGS = -Icryptopp -Isrc/include | 1 | +CXXFLAGS = -Isrc/include |
2 | LDFLAGS = -Llib | 2 | LDFLAGS = -Llib |
3 | -LIBS = -lcryptopp -lpthread | 3 | +LIBS = -lpthread |
4 | TARGETS = bin/client bin/server bin/socket.conf | 4 | TARGETS = bin/client bin/server bin/socket.conf |
5 | 5 | ||
6 | 6 | ||
@@ -9,7 +9,7 @@ TARGETS = bin/client bin/server bin/socket.conf | @@ -9,7 +9,7 @@ TARGETS = bin/client bin/server bin/socket.conf | ||
9 | CXX = g++ | 9 | CXX = g++ |
10 | endif | 10 | endif |
11 | 11 | ||
12 | -bin/client: bin/client.o bin/Socket.o lib/libcryptopp.so | 12 | +bin/client: bin/client.o bin/Socket.o |
13 | $(CXX) -o bin/client bin/client.o bin/Socket.o $(LDFLAGS) $(LIBS) | 13 | $(CXX) -o bin/client bin/client.o bin/Socket.o $(LDFLAGS) $(LIBS) |
14 | strip bin/client | 14 | strip bin/client |
15 | 15 | ||
@@ -22,16 +22,13 @@ bin/server.o: src/server.cpp src/include/server.h | @@ -22,16 +22,13 @@ bin/server.o: src/server.cpp src/include/server.h | ||
22 | bin/main_server.o: src/main_server.cpp | 22 | bin/main_server.o: src/main_server.cpp |
23 | $(CXX) -o bin/main_server.o -c src/main_server.cpp $(CXXFLAGS) | 23 | $(CXX) -o bin/main_server.o -c src/main_server.cpp $(CXXFLAGS) |
24 | 24 | ||
25 | -bin/server: bin/server.o bin/Socket.o bin/main_server.o lib/libcryptopp.so src/include/server.h | 25 | +bin/server: bin/server.o bin/Socket.o bin/main_server.o src/include/server.h |
26 | $(CXX) -o bin/server bin/server.o bin/Socket.o bin/main_server.o $(LDFLAGS) $(LIBS) | 26 | $(CXX) -o bin/server bin/server.o bin/Socket.o bin/main_server.o $(LDFLAGS) $(LIBS) |
27 | strip bin/server | 27 | strip bin/server |
28 | 28 | ||
29 | bin/Socket.o: src/Socket.cpp src/include/Socket.h src/include/SocketException.h | 29 | bin/Socket.o: src/Socket.cpp src/include/Socket.h src/include/SocketException.h |
30 | $(CXX) -o bin/Socket.o -c src/Socket.cpp $(CXXFLAGS) | 30 | $(CXX) -o bin/Socket.o -c src/Socket.cpp $(CXXFLAGS) |
31 | 31 | ||
32 | -lib/libcryptopp.so: | ||
33 | - cd cryptopp;make clean; make dynamic; mv libcryptopp.so ../lib/libcryptopp.so | ||
34 | - | ||
35 | bin/socket.conf: | 32 | bin/socket.conf: |
36 | cp socket.conf bin/socket.conf | 33 | cp socket.conf bin/socket.conf |
37 | 34 |
bin/Socket.o
No preview for this file type
bin/client
No preview for this file type
bin/client.o
No preview for this file type
bin/main_server.o
No preview for this file type
bin/server
No preview for this file type
bin/server.o
No preview for this file type
bin/socket.conf
src/Socket.cpp
@@ -6,24 +6,12 @@ | @@ -6,24 +6,12 @@ | ||
6 | * En este fichero se implementan los métodos de la clase Socket definidos en Socket.h | 6 | * En este fichero se implementan los métodos de la clase Socket definidos en Socket.h |
7 | */ | 7 | */ |
8 | #include "Socket.h" | 8 | #include "Socket.h" |
9 | -#include "SocketException.h" | ||
10 | -#include <sstream> | ||
11 | -#include <strings.h> | ||
12 | -#include <cstdlib> | ||
13 | -#include <netinet/tcp.h> | ||
14 | 9 | ||
15 | using namespace std; | 10 | using namespace std; |
16 | 11 | ||
17 | Socket::Socket() | 12 | Socket::Socket() |
18 | { | 13 | { |
19 | sock = -1; | 14 | sock = -1; |
20 | - if(RSALENGTH > 0) | ||
21 | - { | ||
22 | - memset( myKey, 0x00, AESLENGTH); | ||
23 | - memset( myIV, 0x00, AES::BLOCKSIZE ); | ||
24 | - memset( theirKey, 0x00, AESLENGTH ); | ||
25 | - memset( theirIV, 0x00, AES::BLOCKSIZE ); | ||
26 | - } | ||
27 | } | 15 | } |
28 | 16 | ||
29 | int Socket::getSock() | 17 | int Socket::getSock() |
@@ -39,7 +27,7 @@ void Socket::Create() | @@ -39,7 +27,7 @@ void Socket::Create() | ||
39 | throw SocketException ( "TCP: Could not create socket" ); | 27 | throw SocketException ( "TCP: Could not create socket" ); |
40 | } | 28 | } |
41 | setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,&optval,sizeof optval); | 29 | setsockopt(sock,SOL_SOCKET,SO_KEEPALIVE,&optval,sizeof optval); |
42 | - setsockopt(sock, SOL_TCP, TCP_NODELAY, &optval, sizeof optval); | 30 | + setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &optval, sizeof optval); |
43 | } | 31 | } |
44 | 32 | ||
45 | void Socket::Bind(string address, int port) | 33 | void Socket::Bind(string address, int port) |
@@ -47,7 +35,7 @@ void Socket::Bind(string address, int port) | @@ -47,7 +35,7 @@ void Socket::Bind(string address, int port) | ||
47 | sockAddr.sin_family = AF_INET; | 35 | sockAddr.sin_family = AF_INET; |
48 | sockAddr.sin_port = htons(port); | 36 | sockAddr.sin_port = htons(port); |
49 | sockAddr.sin_addr.s_addr = inet_addr(address.c_str()); | 37 | sockAddr.sin_addr.s_addr = inet_addr(address.c_str()); |
50 | - if(bind(sock, (struct sockaddr *)&sockAddr, sizeof(struct sockaddr)) != 0) | 38 | + if(::bind(sock, (struct sockaddr *)&sockAddr, sizeof(struct sockaddr)) != 0) |
51 | { | 39 | { |
52 | stringstream sstream; | 40 | stringstream sstream; |
53 | sstream << "TCP: Could not bind to address " << address << " on port " << port; | 41 | sstream << "TCP: Could not bind to address " << address << " on port " << port; |
@@ -144,48 +132,32 @@ void Socket::Close() | @@ -144,48 +132,32 @@ void Socket::Close() | ||
144 | } | 132 | } |
145 | } | 133 | } |
146 | 134 | ||
147 | -void Socket::SendUnencrypted(const string& text) | 135 | +const Socket& Socket::operator << ( const std::string& text) |
148 | { | 136 | { |
149 | - stringstream sstream; | 137 | + stringstream sstream; |
150 | int length = text.length(); | 138 | int length = text.length(); |
151 | if(!length) | 139 | if(!length) |
152 | { | 140 | { |
153 | - string s = "0"; | 141 | + string s = "0"; |
154 | Send(s.c_str(), 2); | 142 | Send(s.c_str(), 2); |
155 | - return; | ||
156 | - } | ||
157 | - sstream << length; | ||
158 | - string len = sstream.str(); | ||
159 | - Send(len.c_str(), len.length()+1); | ||
160 | - Send(text.c_str(), text.length()); | ||
161 | -} | ||
162 | - | ||
163 | -const Socket& Socket::operator << ( const std::string& text) | ||
164 | -{ | ||
165 | - if(RSALENGTH <= 0) | ||
166 | - { | ||
167 | - SendUnencrypted(text); | ||
168 | return *this; | 143 | return *this; |
169 | } | 144 | } |
170 | - stringstream sstream; | ||
171 | - string length, cipher = ""; | ||
172 | - int size; | ||
173 | - cipher = encryptAES(text); | ||
174 | - size = cipher.length(); | ||
175 | - sstream << size; | ||
176 | - sstream >> length; | ||
177 | - length = encryptAES(length); | ||
178 | - Send(length.c_str(),length.length()); | ||
179 | - Send(cipher.c_str(),size); | 145 | + sstream << length; |
146 | + string len = sstream.str(); | ||
147 | + char* msg = new char[len.length() + text.length() + 1]; | ||
148 | + strcpy(msg,len.c_str()); | ||
149 | + strcpy(msg+len.length()+1,text.c_str()); | ||
150 | + Send(msg, text.length() + len.length() + 1); | ||
151 | + delete[] msg; | ||
180 | return *this; | 152 | return *this; |
181 | } | 153 | } |
182 | 154 | ||
183 | -void Socket::ReceiveUnencrypted(string& text) | 155 | +const Socket& Socket::operator >> ( std::string& text ) |
184 | { | 156 | { |
185 | text = ""; | 157 | text = ""; |
186 | - string len; | ||
187 | - int length; | ||
188 | - stringstream sstream; | 158 | + string len; |
159 | + int length; | ||
160 | + stringstream sstream; | ||
189 | char c; | 161 | char c; |
190 | while(true) | 162 | while(true) |
191 | { | 163 | { |
@@ -201,10 +173,10 @@ void Socket::ReceiveUnencrypted(string& text) | @@ -201,10 +173,10 @@ void Socket::ReceiveUnencrypted(string& text) | ||
201 | } | 173 | } |
202 | sstream << len; | 174 | sstream << len; |
203 | sstream >> length; | 175 | sstream >> length; |
204 | - if(!length) | ||
205 | - { | ||
206 | - return; | ||
207 | - } | 176 | + if(!length) |
177 | + { | ||
178 | + return *this; | ||
179 | + } | ||
208 | char *message = new char[length]; | 180 | char *message = new char[length]; |
209 | Receive(message,length); | 181 | Receive(message,length); |
210 | text.append(message,length); | 182 | text.append(message,length); |
@@ -213,262 +185,5 @@ void Socket::ReceiveUnencrypted(string& text) | @@ -213,262 +185,5 @@ void Socket::ReceiveUnencrypted(string& text) | ||
213 | delete[] message; | 185 | delete[] message; |
214 | message = NULL; | 186 | message = NULL; |
215 | } | 187 | } |
216 | -} | ||
217 | - | ||
218 | -const Socket& Socket::operator >> ( std::string& text ) | ||
219 | -{ | ||
220 | - if(RSALENGTH <= 0) | ||
221 | - { | ||
222 | - ReceiveUnencrypted(text); | ||
223 | - return *this; | ||
224 | - } | ||
225 | - int length; | ||
226 | - stringstream sstream; | ||
227 | - string recover = "", cipher; | ||
228 | - char *c = new char[AES::BLOCKSIZE]; | ||
229 | - Receive(c, AES::BLOCKSIZE); | ||
230 | - cipher = string(c,AES::BLOCKSIZE); | ||
231 | - recover = decryptAES(cipher); | ||
232 | - sstream << recover; | ||
233 | - sstream >> length; | ||
234 | - if(c != NULL) | ||
235 | - { | ||
236 | - delete[] c; | ||
237 | - c = NULL; | ||
238 | - } | ||
239 | - recover = ""; | ||
240 | - c = new char[length]; | ||
241 | - Receive(c, length); | ||
242 | - cipher = string(c,length); | ||
243 | - recover = decryptAES(cipher); | ||
244 | - text = recover; | ||
245 | - if(c != NULL) | ||
246 | - { | ||
247 | - delete[] c; | ||
248 | - c = NULL; | ||
249 | - } | ||
250 | - return *this; | ||
251 | -} | ||
252 | - | ||
253 | -void Socket::generateRSAKeys() | ||
254 | -{ | ||
255 | - if(RSALENGTH > 0) | ||
256 | - { | ||
257 | - privateKey.Initialize(rng, RSALENGTH); | ||
258 | - RSAFunction publicKey(privateKey); | ||
259 | - myPublicKey.Initialize(publicKey.GetModulus(),publicKey.GetPublicExponent()); | ||
260 | - } | ||
261 | -} | ||
262 | - | ||
263 | -void Socket::generateAESKeys() | ||
264 | -{ | ||
265 | - if(RSALENGTH > 0) | ||
266 | - { | ||
267 | - rng.GenerateBlock(myKey, AESLENGTH ); | ||
268 | - rng.GenerateBlock(myIV, AES::BLOCKSIZE); | ||
269 | - } | ||
270 | -} | ||
271 | - | ||
272 | -bool Socket::sendPublicKey() | ||
273 | -{ | ||
274 | - if(RSALENGTH > 0) | ||
275 | - { | ||
276 | - stringstream sstream; | ||
277 | - sstream << myPublicKey.GetModulus(); | ||
278 | - sstream << " "; | ||
279 | - sstream << myPublicKey.GetPublicExponent(); | ||
280 | - string data = sstream.str(); | ||
281 | - try | ||
282 | - { | ||
283 | - SendUnencrypted(data); | ||
284 | - } | ||
285 | - catch(SocketException& e) | ||
286 | - { | ||
287 | - return false; | ||
288 | - } | ||
289 | - } | ||
290 | - return true; | ||
291 | -} | ||
292 | - | ||
293 | -bool Socket::receivePublicKey() | ||
294 | -{ | ||
295 | - if(RSALENGTH > 0) | ||
296 | - { | ||
297 | - string data = ""; | ||
298 | - struct timeval tv; | ||
299 | - tv.tv_sec = 10; | ||
300 | - tv.tv_usec = 0; | ||
301 | - setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); | ||
302 | - try | ||
303 | - { | ||
304 | - ReceiveUnencrypted(data); | ||
305 | - } | ||
306 | - catch(SocketException& e) | ||
307 | - { | ||
308 | - return false; | ||
309 | - } | ||
310 | - tv.tv_sec = 0; | ||
311 | - setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv,sizeof(struct timeval)); | ||
312 | - stringstream sstream; | ||
313 | - sstream.str(data); | ||
314 | - Integer modulus,exponent; | ||
315 | - sstream >> modulus; | ||
316 | - sstream >> exponent; | ||
317 | - theirPublicKey.Initialize(modulus,exponent); | ||
318 | - if(!theirPublicKey.Validate(rng, 1)) | ||
319 | - { | ||
320 | - return false; | ||
321 | - } | ||
322 | - } | ||
323 | - return true; | ||
324 | -} | ||
325 | - | ||
326 | -void Socket::setKeys(RSAFunction *pubkey, InvertibleRSAFunction *privkey, byte *key, byte *iv) | ||
327 | -{ | ||
328 | - if(RSALENGTH > 0) | ||
329 | - { | ||
330 | - myPublicKey = *pubkey; | ||
331 | - privateKey = *privkey; | ||
332 | - memcpy(myIV,iv,AES::BLOCKSIZE); | ||
333 | - memcpy(myKey,key,AESLENGTH); | ||
334 | - } | ||
335 | -} | ||
336 | - | ||
337 | -InvertibleRSAFunction* Socket::getPrivateKey() | ||
338 | -{ | ||
339 | - return &privateKey; | ||
340 | -} | ||
341 | - | ||
342 | -RSAFunction* Socket::getPublicKey() | ||
343 | -{ | ||
344 | - return &myPublicKey; | ||
345 | -} | ||
346 | - | ||
347 | -void Socket::sendAES() | ||
348 | -{ | ||
349 | - if(RSALENGTH > 0) | ||
350 | - { | ||
351 | - stringstream sstream; | ||
352 | - string k((char*)myKey,AESLENGTH); | ||
353 | - string i((char*)myIV,AES::BLOCKSIZE); | ||
354 | - sstream << k << " " << i; | ||
355 | - string key = sstream.str(); | ||
356 | - string cipher = encryptRSA(key); | ||
357 | - Send(cipher.c_str(), MAXLENGTH); | ||
358 | - } | ||
359 | -} | ||
360 | - | ||
361 | -void Socket::recvAES() | ||
362 | -{ | ||
363 | - if(RSALENGTH > 0) | ||
364 | - { | ||
365 | - stringstream sstream; | ||
366 | - char *c = new char[MAXLENGTH]; | ||
367 | - Receive(c, MAXLENGTH); | ||
368 | - string key = string(c,MAXLENGTH), k, i; | ||
369 | - key = decryptRSA(key); | ||
370 | - k = key.substr(0,AESLENGTH); | ||
371 | - i = key.substr(AESLENGTH+1); | ||
372 | - memcpy(theirKey,k.c_str(),AESLENGTH); | ||
373 | - memcpy(theirIV,i.c_str(),AES::BLOCKSIZE); | ||
374 | - if(c != NULL) | ||
375 | - { | ||
376 | - delete[] c; | ||
377 | - c = NULL; | ||
378 | - } | ||
379 | - } | ||
380 | -} | ||
381 | - | ||
382 | -byte* Socket::getAESKey() | ||
383 | -{ | ||
384 | - return myKey; | ||
385 | -} | ||
386 | - | ||
387 | -byte* Socket::getAESIV() | ||
388 | -{ | ||
389 | - return myIV; | ||
390 | -} | ||
391 | - | ||
392 | -string Socket::encryptRSA(string& text) | ||
393 | -{ | ||
394 | - RSAES_OAEP_SHA_Encryptor e(theirPublicKey); | ||
395 | - string cipher; | ||
396 | - StringSource ss1(text, true, new PK_EncryptorFilter(rng, e, new StringSink(cipher))); | ||
397 | - return cipher; | ||
398 | -} | ||
399 | - | ||
400 | -string Socket::decryptRSA(string& crypt) | ||
401 | -{ | ||
402 | - RSAES_OAEP_SHA_Decryptor d(privateKey); | ||
403 | - string recovered; | ||
404 | - StringSource ss2(crypt, true,new PK_DecryptorFilter(rng, d,new StringSink(recovered))); // StringSource | ||
405 | - return recovered; | ||
406 | -} | ||
407 | - | ||
408 | -string Socket::encryptAES(const string& text) | ||
409 | -{ | ||
410 | - string cipher; | ||
411 | - AES::Encryption aesEncryption(myKey, AESLENGTH); | ||
412 | - CBC_Mode_ExternalCipher::Encryption cbcEncryption( aesEncryption, myIV ); | ||
413 | - StreamTransformationFilter stfEncryptor(cbcEncryption, new StringSink( cipher ) ); | ||
414 | - stfEncryptor.Put( reinterpret_cast<const unsigned char*>( text.c_str() ), text.length()); | ||
415 | - stfEncryptor.MessageEnd(); | ||
416 | - return cipher; | ||
417 | -} | ||
418 | - | ||
419 | -string Socket::decryptAES(const string& crypt) | ||
420 | -{ | ||
421 | - string recovered; | ||
422 | - AES::Decryption aesDecryption(theirKey, AESLENGTH); | ||
423 | - CBC_Mode_ExternalCipher::Decryption cbcDecryption( aesDecryption, theirIV ); | ||
424 | - CryptoPP::StreamTransformationFilter stfDecryptor(cbcDecryption, new CryptoPP::StringSink( recovered ) ); | ||
425 | - stfDecryptor.Put( reinterpret_cast<const unsigned char*>( crypt.c_str() ), crypt.size() ); | ||
426 | - stfDecryptor.MessageEnd(); | ||
427 | - return recovered; | ||
428 | -} | ||
429 | - | ||
430 | -void Socket::LoadKey(const string& filename, PublicKey *key) | ||
431 | -{ | ||
432 | - ByteQueue queue; | ||
433 | - FileSource file(filename.c_str(), true); | ||
434 | - file.TransferTo(queue); | ||
435 | - queue.MessageEnd(); | ||
436 | - key->Load(queue); | ||
437 | -} | ||
438 | - | ||
439 | -void Socket::SaveKey(const string& filename, const PublicKey *key) | ||
440 | -{ | ||
441 | - ByteQueue queue; | ||
442 | - key->Save(queue); | ||
443 | - FileSink file(filename.c_str()); | ||
444 | - queue.CopyTo(file); | ||
445 | - file.MessageEnd(); | ||
446 | -} | ||
447 | - | ||
448 | -void Socket::loadKeys(string pub, string priv) | ||
449 | -{ | ||
450 | - if(RSALENGTH > 0) | ||
451 | - { | ||
452 | - ifstream pubkey,privkey; | ||
453 | - pubkey.open(pub.c_str()); | ||
454 | - privkey.open(priv.c_str()); | ||
455 | - if(pubkey.is_open() || privkey.is_open()) | ||
456 | - { | ||
457 | - pubkey.close(); | ||
458 | - privkey.close(); | ||
459 | - LoadKey(pub, getPublicKey()); | ||
460 | - LoadKey(priv, getPrivateKey()); | ||
461 | - if(getPublicKey()->Validate(rng, 1) || getPrivateKey()->Validate(rng,1)) | ||
462 | - { | ||
463 | - generateAESKeys(); | ||
464 | - return; | ||
465 | - } | ||
466 | - } | ||
467 | - pubkey.close(); | ||
468 | - privkey.close(); | ||
469 | - generateRSAKeys(); | ||
470 | - SaveKey(priv, getPrivateKey()); | ||
471 | - SaveKey(pub, getPublicKey()); | ||
472 | - generateAESKeys(); | ||
473 | - } | 188 | + return *this; |
474 | } | 189 | } |
src/client.cpp
@@ -12,12 +12,6 @@ | @@ -12,12 +12,6 @@ | ||
12 | #include <signal.h> | 12 | #include <signal.h> |
13 | 13 | ||
14 | #include <sys/time.h> | 14 | #include <sys/time.h> |
15 | -//! Ruta a la llave privada | ||
16 | -/*! Ruta relativa o absoluta a la llave privada RSA, si no existe o es inválida, se creará una nueva en esa localización. */ | ||
17 | -#define PRIVATEKEY "bin/private_client.key" | ||
18 | -//! Ruta a la llave pública | ||
19 | -/*! Ruta relativa o absoluta a la llave pública RSA, si no existe o es inválida, se creará una nueva en esa localización. */ | ||
20 | -#define PUBLICKEY "bin/public_client.key" | ||
21 | 15 | ||
22 | using namespace std; | 16 | using namespace std; |
23 | 17 | ||
@@ -30,28 +24,12 @@ void exitClient(int signal/*!<Parámetro que captura el signal recibido*/) | @@ -30,28 +24,12 @@ void exitClient(int signal/*!<Parámetro que captura el signal recibido*/) | ||
30 | exit(-1); | 24 | exit(-1); |
31 | } | 25 | } |
32 | 26 | ||
33 | -//! Método para intercambiar llaves de encriptación | ||
34 | -/*! Este método sirve para intercambiar las llaves de encriptación con el servidor al otro lado del socket. */ | ||
35 | -void exchangeKeys(Socket &s/*!<Socket cliente que intercambia las llaves con el servidor*/) | ||
36 | -{ | ||
37 | - if(!s.receivePublicKey() || !s.sendPublicKey()) | ||
38 | - { | ||
39 | - cout << "Error exchanging keys" << endl << "Exiting" << endl; | ||
40 | - s.Close(); | ||
41 | - cout << "Socket closed" << endl; | ||
42 | - exit(-1); | ||
43 | - } | ||
44 | - s.recvAES(); | ||
45 | - s.sendAES(); | ||
46 | -} | ||
47 | - | ||
48 | //! Método principal del cliente | 27 | //! Método principal del cliente |
49 | /*! Este método inicializa el Socket, establece la conexión y realiza las acciones que se le hayan programado para comunicarse con el servidor.*/ | 28 | /*! Este método inicializa el Socket, establece la conexión y realiza las acciones que se le hayan programado para comunicarse con el servidor.*/ |
50 | int main() | 29 | int main() |
51 | { | 30 | { |
52 | signal(SIGPIPE, exitClient); | 31 | signal(SIGPIPE, exitClient); |
53 | Socket s; | 32 | Socket s; |
54 | - s.loadKeys(PUBLICKEY,PRIVATEKEY); | ||
55 | string send, recv, host; | 33 | string send, recv, host; |
56 | int port; | 34 | int port; |
57 | s.Create(); | 35 | s.Create(); |
@@ -71,7 +49,6 @@ int main() | @@ -71,7 +49,6 @@ int main() | ||
71 | return -1; | 49 | return -1; |
72 | } | 50 | } |
73 | cout << "Connected" << endl; | 51 | cout << "Connected" << endl; |
74 | - exchangeKeys(s); | ||
75 | while(true) | 52 | while(true) |
76 | { | 53 | { |
77 | cout << "> "; | 54 | cout << "> "; |
src/include/Socket.h
@@ -9,38 +9,18 @@ | @@ -9,38 +9,18 @@ | ||
9 | #define SOCKET_H_ | 9 | #define SOCKET_H_ |
10 | 10 | ||
11 | #include <iostream> | 11 | #include <iostream> |
12 | +#include <sstream> | ||
13 | +#include "SocketException.h" | ||
12 | #include <sys/socket.h> | 14 | #include <sys/socket.h> |
15 | +#include <sys/types.h> | ||
13 | #include <netinet/in.h> | 16 | #include <netinet/in.h> |
17 | +#include <netinet/tcp.h> | ||
14 | #include <arpa/inet.h> | 18 | #include <arpa/inet.h> |
15 | #include <netdb.h> | 19 | #include <netdb.h> |
16 | -#include <string> | ||
17 | -#include <sys/types.h> | ||
18 | #include <unistd.h> | 20 | #include <unistd.h> |
19 | -#include <rsa.h> | ||
20 | -#include <sha.h> | ||
21 | -#include <filters.h> | ||
22 | -#include <files.h> | ||
23 | -#include <osrng.h> | ||
24 | -#include <secblock.h> | ||
25 | -#include <cryptlib.h> | ||
26 | -#include <aes.h> | ||
27 | -#include <modes.h> | ||
28 | - | ||
29 | -//! Longitud de la llave RSA | ||
30 | -/*! \brief Longitud en bits de la llava RSA usada para encriptar la llave AES. Una longitud de 0 indica que el mensaje se trasnmitirá SIN encriptar. | 21 | +#include <cstdlib> |
22 | +#include <cstring> | ||
31 | 23 | ||
32 | -__NOTA: Si se usara una longitud menor a 728 bits habria que modificar el método que envía y recibe la llave AES, ya que la longitud máxima del | ||
33 | -mensaje a encriptar con RSA no sería suficiente para transmitir la llave y el IV en un solo paquete. De todas formas, se recomienda NO USAR una | ||
34 | -llave de longitud inferior a 768 bits, la llave RSA de 512 bits se puede descifrar con un Pentium 4 en unas 8 horas.__ */ | ||
35 | -#define RSALENGTH 1024 | ||
36 | -//! Longitud de la llave AES | ||
37 | -/*! \brief Longitud en bytes de la llave AES usada para encriptar el mensaje. Los valores permitidos son 16, 24 y 32 */ | ||
38 | -#define AESLENGTH 16 | ||
39 | -//! Longitud del paquete encriptado con RSA | ||
40 | -/*! \brief Longitud en bytes del tamaño de cada paquete encriptado con RSA, esto sólo se usaría para la transmisión de la llave AES */ | ||
41 | -#define MAXLENGTH (RSALENGTH/8) | ||
42 | - | ||
43 | -using namespace CryptoPP; | ||
44 | using namespace std; | 24 | using namespace std; |
45 | 25 | ||
46 | //! Clase del socket | 26 | //! Clase del socket |
@@ -57,42 +37,6 @@ class Socket | @@ -57,42 +37,6 @@ class Socket | ||
57 | //! Estructura de dirección de socket | 37 | //! Estructura de dirección de socket |
58 | /*! Este struct es usado por el SO para gestionar la dirección del socket abierto. */ | 38 | /*! Este struct es usado por el SO para gestionar la dirección del socket abierto. */ |
59 | struct sockaddr_in sockAddr; | 39 | struct sockaddr_in sockAddr; |
60 | - //! Pseudo-generador de números aleatorios | ||
61 | - /*! Esta variable se usa para generar los números aleatorios necesarios para la creación de las llaves criptográficas. */ | ||
62 | - AutoSeededRandomPool rng; | ||
63 | - //! Llave privada RSA | ||
64 | - /*! Esta variable contiene la llave privada RSA generada. */ | ||
65 | - RSA::PrivateKey privateKey; | ||
66 | - //! Llave pública RSA própia | ||
67 | - /*! Esta variable contiene la llave RSA pública generada por el própio socket. */ | ||
68 | - RSA::PublicKey myPublicKey; | ||
69 | - //! Llave pública RSA del peer | ||
70 | - /*! Esta variable contiene la llave RSA pública recibida del peer al otro lado del socket. */ | ||
71 | - RSA::PublicKey theirPublicKey; | ||
72 | - //! Llave AES própia | ||
73 | - /*! Esta variable contiene la llave AES generada por el própio socket. */ | ||
74 | - byte myKey[AESLENGTH]; | ||
75 | - //! IV própio | ||
76 | - /*! Esta variable contiene el IV generado por el própio socket. */ | ||
77 | - byte myIV[ AES::BLOCKSIZE ]; | ||
78 | - //! Llave AES del peer | ||
79 | - /*! Esta variable contiene la llave AES recibida del peer al otro lado del socket. */ | ||
80 | - byte theirKey[AESLENGTH]; | ||
81 | - //! IV del peer | ||
82 | - /*! Esta variable contiene el IV recibido del peer al otro lado del socket. */ | ||
83 | - byte theirIV[ AES::BLOCKSIZE ]; | ||
84 | - //! Método de encriptación RSA | ||
85 | - /*! Este método devuelve el mensaje que se le pasa por argumento encriptado con RSA en forma de string. */ | ||
86 | - string encryptRSA(string& text /*!<Texto a encriptar*/); | ||
87 | - //!Método de desencriptación RSA | ||
88 | - /*! Este método devuelve el mensaje que se la pasa por argumento desencriptado con RSA en forma de string. */ | ||
89 | - string decryptRSA(string& crypt/*!<Mensaje a desencriptar*/); | ||
90 | - //! Método de encriptación AES | ||
91 | - /*! Este método devuelve el mensaje que se le pasa por argumento encriptado con AES en forma de string. */ | ||
92 | - string encryptAES(const string& text/*!<Texto a encriptar*/); | ||
93 | - //! Método de desencriptación AES | ||
94 | - /*! Este método devuelve el mensaje que se la pasa por argumento desencriptado con AES en forma de string. */ | ||
95 | - string decryptAES(const string& crypt/*!<Mensaje a desencriptar*/); | ||
96 | //! Método para recibir un mensaje de longitud conocida | 40 | //! Método para recibir un mensaje de longitud conocida |
97 | /*! \brief Este método se usa para recibir un mensaje de la longitud que se especifica por argumento y almacenarlo en el buffer | 41 | /*! \brief Este método se usa para recibir un mensaje de la longitud que se especifica por argumento y almacenarlo en el buffer |
98 | proporcionado. | 42 | proporcionado. |
@@ -105,19 +49,6 @@ class Socket | @@ -105,19 +49,6 @@ class Socket | ||
105 | 49 | ||
106 | _Este método garantiza que todo el mensaje se enviará entero aunque la red no admita una longitud de paquete tan grande._*/ | 50 | _Este método garantiza que todo el mensaje se enviará entero aunque la red no admita una longitud de paquete tan grande._*/ |
107 | int Send(const char *buff/*!<Buffer con el mensaje a enviar*/, int length/*!<Longitud del mensaje*/); | 51 | int Send(const char *buff/*!<Buffer con el mensaje a enviar*/, int length/*!<Longitud del mensaje*/); |
108 | - //! Método para enviar un un string en texto llano | ||
109 | - /*! Este método se sirve de Send() para enviar un mensaje sin encriptar usando el \ref proto "protocolo" implementado. */ | ||
110 | - void SendUnencrypted(const string& text/*!<Texto a enviar*/); | ||
111 | - //! Método para recibir un string en texto llano | ||
112 | - /*! Este método se sirve del método Receive() para recibir un mensaje sin encriptar de longitud arbitrária usando el | ||
113 | - \ref proto "protocolo" implementado. */ | ||
114 | - void ReceiveUnencrypted(string& text/*!<String donde se almacena el texto recibido*/); | ||
115 | - //! Método para cargar llaves RSA | ||
116 | - /*! Este método lee del disco una llave RSA y la asigna al Socket que lo invoca. */ | ||
117 | - void LoadKey(const string& filename/*!<Ruta absoluta o relativa a la llave*/, PublicKey *key/*!<Llave donde se almacenan los datos leídos*/); | ||
118 | - //! Método para guardar llaves RSA | ||
119 | - /*! Este método guarda al disco una llave RSA proporcionada por argumento. */ | ||
120 | - void SaveKey(const string& filename/*!<Ruta absoluta o relativa a la llave*/, const PublicKey *key/*!<Llave a almacenar*/); | ||
121 | 52 | ||
122 | public: | 53 | public: |
123 | //! Constructor de la clase Socket | 54 | //! Constructor de la clase Socket |
@@ -147,47 +78,6 @@ class Socket | @@ -147,47 +78,6 @@ class Socket | ||
147 | //! Getter para el file descriptor del socket | 78 | //! Getter para el file descriptor del socket |
148 | /*! Este método devuelve el file descriptor del socket. */ | 79 | /*! Este método devuelve el file descriptor del socket. */ |
149 | int getSock(); | 80 | int getSock(); |
150 | - //! Método para generar las llaves RSA | ||
151 | - /*! Este método genera las llaves pública y privada RSA y las asigna la instancia de Socket que lo ha invocado. */ | ||
152 | - void generateRSAKeys(); | ||
153 | - //! Método para generar las llaves AES | ||
154 | - /*! Este método genera la llave y el IV de AES y los asigna a la instancia de Socket que lo ha invocado. */ | ||
155 | - void generateAESKeys(); | ||
156 | - //! Método para mandar la llave pública | ||
157 | - /*! Este método manda la llave pública RSA sin encriptar por el socket. */ | ||
158 | - bool sendPublicKey(); | ||
159 | - //! Método para recibir la llave pública | ||
160 | - /*! Este método sirve para recibir la llave pública RSA de otro Socket. */ | ||
161 | - bool receivePublicKey(); | ||
162 | - //! Método para transferir llaves entre objetos Socket | ||
163 | - /*! Este método sirve para que dos instancias de Socket intercambien sus llaves criptológicas dentro de la misma | ||
164 | - máquina. | ||
165 | - | ||
166 | - _Se usa para cuando un Socket de tipo servidor genere una instancia de otro Socket para comunicarse con el cliente, el primero | ||
167 | - le transfiera las llaves generadas al segundo para poder realizar la comunicación._*/ | ||
168 | - void setKeys(RSAFunction *pubkey/*!<Llave pública RSA*/, InvertibleRSAFunction *privkey/*!<Llave privada RSA*/, byte *key/*!<Llave AES*/, byte *iv/*!<IV AES*/); | ||
169 | - //! Getter de la llave pública RSA | ||
170 | - /*! Este método devuelve la llave pública RSA para poder transferirla a otro Socket usando setKeys(). */ | ||
171 | - RSAFunction* getPublicKey(); | ||
172 | - //! Getter de la llave privada RSA | ||
173 | - /*! Este método devuelve la llave privada RSA para poder transferirla a otro Socket usando setKeys(). */ | ||
174 | - InvertibleRSAFunction* getPrivateKey(); | ||
175 | - //! Método para mandar la llave AES | ||
176 | - /*! Este método manda la llave AES y el IV del Socket que lo invoca encriptados con RSA. */ | ||
177 | - void sendAES(); | ||
178 | - //! Método para recibir la llave AES | ||
179 | - /*! Este método sirve para recibir la llave AES y el IV de otro Socket encriptados por RSA. */ | ||
180 | - void recvAES(); | ||
181 | - //! Getter de la llave AES | ||
182 | - /*! Este método devuelve la llave AES para poder transferirla a otro Socket usando setKeys(). */ | ||
183 | - byte* getAESKey(); | ||
184 | - //! Getter del IV AES | ||
185 | - /*! Este método devuelve el IV AES para poder transferirla a otro Socket usando setKeys(). */ | ||
186 | - byte* getAESIV(); | ||
187 | - //! Método para cargar las llaves del disco | ||
188 | - /*! Este método lee las llaves RSA del disco o las genera y guarda de nuevo si no existen o son inválidas. También genera | ||
189 | - las llaves AES. */ | ||
190 | - void loadKeys(string pub/*!<Ruta absoluta o relativa a la llave pública RSA*/, string priv/*!<Ruta absoluta o relativa a la llave privada RSA*/); | ||
191 | //! Método para enviar mensajes | 81 | //! Método para enviar mensajes |
192 | /*! Este método envía el mensaje que se le proporciona a través del Socket con o sin encriptación según | 82 | /*! Este método envía el mensaje que se le proporciona a través del Socket con o sin encriptación según |
193 | las \ref defines "opciones de compilación" usando el \ref proto "protocolo" implementado. */ | 83 | las \ref defines "opciones de compilación" usando el \ref proto "protocolo" implementado. */ |
src/server.cpp
@@ -54,7 +54,6 @@ void Server::requestExit() | @@ -54,7 +54,6 @@ void Server::requestExit() | ||
54 | void Server::startServer(string i, int p) | 54 | void Server::startServer(string i, int p) |
55 | { | 55 | { |
56 | Socket ss; | 56 | Socket ss; |
57 | - ss.loadKeys(PUBLICKEY,PRIVATEKEY); | ||
58 | string ip = i; | 57 | string ip = i; |
59 | int port = p; | 58 | int port = p; |
60 | signal(SIGPIPE, SIG_IGN); | 59 | signal(SIGPIPE, SIG_IGN); |
@@ -96,20 +95,6 @@ void Server::startServer(string i, int p) | @@ -96,20 +95,6 @@ void Server::startServer(string i, int p) | ||
96 | break; | 95 | break; |
97 | } | 96 | } |
98 | pthread_mutex_lock(&m_mutex); | 97 | pthread_mutex_lock(&m_mutex); |
99 | - cs->setKeys(ss.getPublicKey(), ss.getPrivateKey(), ss.getAESKey(), ss.getAESIV()); | ||
100 | - if(!cs->sendPublicKey() || !cs->receivePublicKey()) | ||
101 | - { | ||
102 | - cs->Close(); | ||
103 | - if(cs != 0) | ||
104 | - { | ||
105 | - delete cs; | ||
106 | - cs = 0; | ||
107 | - } | ||
108 | - pthread_mutex_unlock(&m_mutex); | ||
109 | - continue; | ||
110 | - } | ||
111 | - cs->sendAES(); | ||
112 | - cs->recvAES(); | ||
113 | thread_args *t_args = new thread_args; | 98 | thread_args *t_args = new thread_args; |
114 | pthread_t *thread = new pthread_t; | 99 | pthread_t *thread = new pthread_t; |
115 | t_args->mutex = &m_mutex; | 100 | t_args->mutex = &m_mutex; |