BitM — an anonymous messenger for Bitcoin users
While Bitcoin provides an anonymous and distributed payment system, there is no an easy way for communication between Bitcoin peers.
In this post, I am going to describe BitM, an anonymous, decentralized messenger for the Bitcoin users (and potentially for users of other cryptocurrencies).
Problem 1. Sending data along with a payment. Let’s consider an example where you pay your domain name registrar to renew your domain in Bitcoin. There is no an easy way to to specify in Blockchain transaction the domain name you are paying for. You somehow need to tell a domain registrar a transaction id, the domain name you are paying for, and ensure that it is really you, who made this transaction. While later is possible by signing a message using your private key, there is no a standard, Bitcoinish way to deliver a message to a specific Bitcoin address owned by a domain name registrar.
Problem 2. Contacting an arbitrary Bitcoin address. Imagine that you found out that someone’s Bitcoin wallet is compromised and you would like to notify them about it. However, all that you know is a Bitcoin address. Unfortunately, Bitcoin and many other cryptocurrencies do not provide a way to contact peer by its address.
Problem 3. Digital asset trading. Let’s say you want to buy a digital asset from a specific Bitcoin address. First, you can request from that address what are the buying options. Then, make a payment. And, finally, get a digital asset delivered to your Bitcoin address. A seller can completely automate this process with a chat bot.
Problem 4. Anonymous messenger. You can simply use messenger to chat anonymously with your peers without exposing your phone number or email address.
Identification. Bitcoin address can be used as an ID for communication between peers. There is no need to use email or phone number.
Encryption. Very few people know that Bitcoin allows not only to use its private keys for signing messages but also use public keys for encrypting them with ECDSA algorithm. ECDSA is not designed for encryption. However, there is a way how to use Bitcoin key pairs to establish a secure connection between peers using ECC algorithm:
Using ECDH encryption algorithm makes it possible to create a shared secret that can be used for establishing 256-bit symmetric AES encryption, and then for 2048-bit RSA encryption.
Another common problem that may occur is getting a public key from the Bitcoin address. You need a public key to encrypt a message, but how would you get it? The answer is to get a signature made by this public address. As every transaction is signed it is possible to get a public key for any Bitcoin address which has ever made a payment, see:
And of course, for signing messages, you can use our own private key. For a better anonymity a message and its metadata should be signed first, and then encrypted.
Anonymity. The key to being anonymous when using BitM is to disallow anyone to look up your IP address by your Bitcoin address. In the simple case, when you connect to a server to get an encrypted message for your Bitcoin address server can figure out both your Bitcoin and IP addresses, hence to identify you. To avoid such identification, your IP address should be masked using services like Tor. There is OnionKit library for Android and iOS that can be used in the mobile messaging client.
Routing. For routing a message to a Bitcoin address, instead of using a central server, a distributed p2p database can be used. One of later is OrbitDB which is based on IPFS Pubsub. To understand how it works, see this video.
Group chats. To implement a group chat, every member of a group should send his message to all members of a group and specify recipient addresses in his message. It will work the similar way as the group chat works in Slack.
Channels. To create an IRC or Slack like channel a peer need to generate a new Bitcoin pair of keys and provide them to a channel participants. Every peer can use a public key to read messages, and private key to write messages to a channel.
Follow only channels. To create a Twitter like channel, a peer needs to generate a new Bitcoin pair of keys. A private key should be in the format that includes a special prefix and an address of a channel creator. This special prefix will help to distinguish posts made by a channel creator, from posts made by channel subscribers.
Attachments. Since transferring attachments can provide overhead, it makes sense to encrypt and save them in the IPFS (InterPlanetary File System).
Altcoin support. It should not be a problem to support other cryptocurrencies since many of them similarly to Bitcoin.
P2p technologies provide us tools and ideas for improvisation and building awesome stuff. We should take this opportunity to face challenges of the new era. Being private and anonymous is a key to a common good!
Here is a prove of concept: https://medium.com/@dealancer/how-to-using-bitcoin-key-pairs-to-for-encrypted-messaging-a0a980e627b1.
Like an Idea? Make it happen: 135rcdVPUie3g1PXPazALpggZ6E72HVNj1!