Search code examples
c#.netencryptionrsaencryption-asymmetric

Sending messages between two clients, how to verify the identity of the sender?


So assume you have two clients, C1 and C2, each client has a GUID associated with it.

How do you, when you receive a message on C2 that supposedly comes from C1 (by checking the GUID and seeing that it matches the GUID of C1), but since the message is not guaranteed to have come from C1 (C3 might just have sent the message, sending the GUID of C1 in the message header) there has to be some verification that the message actually came from C1.

I've been looking into using asymmetric encryption (RSA) to have C1 send a message that consists of [C1.GUID; RSAEncrypt(C2.PUBLIC_KEY, C1.GUID); MESSAGE], and then let C2 basically do a check like this (python pseudo code):

message.GUID == RSADecrypt(C2.PRIVATE_KEY, message.ENCRYPTED_GUID)

Is this a viable approach? Or is there some other clever/more obvious way to verify the sender of a message?


Solution

  • Assymmetric Algorithms have been invented for such purposes, that's the way digital signatures work.

    However, your approach has some problems. Anyone with the public key of the recipient could fake the signature. Also, the signature does not change at all! Anyone intercepting the messages can fake being a valid sender. The purpose of assymetric encryption is to defeat these problems with key exchanges, there's the concept of the digital signature, which is basically an assymetrically encrypted hash of the message you are tossing around.

    For RSA, you need to do a bit more in order to create a digital signature from the basic algorithm, see wikipedia for more details: http://en.wikipedia.org/wiki/RSA#Signing_messages

    I'd just use a digital signature algorithm from a library. First google search turns up with this for Python:

    http://www.example-code.com/python/pythonrsa.asp

    http://www.chilkatsoft.com/dsa-python.asp