Well, just a small idea.
Lets say i want to speak securely to someone over the net. The person might be connected miles away from me bu assuming he has gained access to the net. The idea is to exchange the voice through the net. Since its not an easy way to get a public IP, i would prefer a server-client way instead. My PC and the PC of the person whom i talked to are said to be clients interconnected through a public server. I do not have suffecient knowledge on VoIP and i would not reinvent the wheel
.
The simplified scheme is as following. The server is in fact continuously listening to connected clients, acquiring their status, responses to their query, propagates requests for another client and forward voice streams. The client is periodically accessing the server to know what to do, what to provide and what to response.
Lets start sampling the voice through microphone and dump incoming streams to headset through ADC/DAC of soundcard of my PC using ALSA (Advanced Linux Sound Architecture) library. My sampled voice would be compressed further using CELP (Code Exitation Linear Prediction) through speex library. The compressed voice would be further ciphered using 256-bit AES (Advanced Encryption Standard) and sent to the server. The server would receive encrypted voice packet and forward it to adressed client. The receiving client would firstly look for packet number to synchronize and decipher it properly. The deciphered would be a CELP (Code Exitation Linear Prediction) compressed voice packet that needs to be uncompressed further using speex library. The uncompressed voice would be sent to ALSA (Advanced Linux Architecture) library for further processing to DAC and lastly to headphone or loudspeaker.
The things mainly used here are libspeex for voice compressing, alsa-lib for soundcard interfaacing, AESx86 asm routine for ciphering purpose, libtom for key exchange purpose, and socket programming as well as IPC for internal mechanism. The simplified diagram would be as following.
GUI (Graphical User Interface) module would be a small GTK+ based program, providing interface for dialing, acquiring statuses. The controller module would be the one responsible to control the rest according to user response and server response. The cipher module would provide cipherkeys for incoming and outgoing as two separated streams. The keygen module would provides Diffie-Hellman key exchange mechanism to generate private keys for incoming stream and outgoing stream cipher-keys. The codec module provides compressed voice sampled from microphone and processes compressed incoming voice to loudspeaker. Packetizer module would be responsible of tacking care packet synchronization. and Last but not the least, connection module as a front-end that interface the net using socket programming.
I would start develop and release this as a GPL version 3 licensed open source project strictly for fun, hobbyist, educational, non-commercial and of course non-criminal activity. Please suggest me hints and feedbacks for better result.






. I belief that this scheme works better at larger memory space such as 128-bit that enables the usage of AES.
Source Code |











