Private Messaging Protocol on Robinhood Chain

Your
Inbox.
Your Key.

Mint a nontransferable inbox NFT. Receive encrypted messages that only you can read. No plaintext ever leaves the sender's device.

How It Works

Core Protocol
01 — Mint

Create Your Inbox

One nontransferable ERC-721 per wallet on Robinhood Chain. Generates an RSA-2048 keypair in your browser during mint.

> mintInbox() → tokenId #1
> generateKeyPair() → RSA-OAEP 2048
> setPublicKey(1, 0x...) → ✓
02 — Send

Encrypt & Deliver

Anyone can send a message — no wallet needed. AES-256-GCM encrypts the content; RSA wraps the AES key with the recipient's public key.

plaintext encrypted in-browser
only ciphertext stored
03 — Read

Decrypt & Read

Connect wallet → verify NFT ownership → fetch encrypted messages → decrypt with your local private key. Plaintext never leaves your browser.

■ NFT verified  ■ Key found  ■ Decrypted
04 — Backup

Export Your Key

Download your private key in PEM format. Import in any browser to restore access. Losing the key means losing message access permanently.

-----BEGIN ORIS PRIVATE KEY-----
MIIEvgIBADANBgkqh...
-----END ORIS PRIVATE KEY-----

Encryption Architecture

Hybrid RSA-OAEP + AES-256-GCM
Generate

RSA-OAEP 2048-bit
SHA-256 hash
Extractable keypair

Browser
Encrypt

256-bit random key
12-byte IV per msg
Authenticated enc.

Sender
Store

Encrypted content
Encrypted AES key
Initialization vector

Server
Decrypt

RSA unwrap AES key
AES-GCM decrypt
Plaintext in browser

Owner

Trust & Transparency

2048

bit RSA key

256

bit AES

0

server plaintext

100%

client-side

Message content encrypted end-to-end

Private keys never leave your browser

Wallet addresses & activity are public — this is not anonymous

For Developers

Build With
the SDK

Three functions. That's all you need to add private encrypted messaging to your dApp.

// sdk-example.ts
import { OrisSDK } from 'orisnft-sdk'

// Send encrypted
await sdk.sendMessage(1, 'Hello!')

// Decrypt & read
const msgs = await sdk.listMessages(1, key)