Generate a public/private pair of keys for each user in each chat, using user-provided entropy (key strokes, etc.). For each message sent, encrypt it using a random single-use key and encode the passphrase using the recipient's public key. Recipient can decrypt the message after it decodes the passphrase using his private key