Solana Encryption
Solana employs the Edwards-curve Digital Signature Algorithm (EdDSA), an elliptical signature algorithm for cryptography.
K2 is a fork of Solana, so messages can also be encrypted using Koii addresses!
Helper Functions
Create two helper functions to help encode a message and decode data using TextEncoder
and TextDecoder
, respectively.
TextEncoder
— An interface that takes in a stream of code points as input and emits a stream of UTF-8 bytes.TextDecoder
— An interface that represents a decoder for a specific text encoding, such as UTF-8, ISO-8859-2, etc.
// Encode message
const encode = (message) => {
const encoder = new TextEncoder();
const messageUint8 = encoder.encode(message); // Takes a string and returns a Uint8Array
return messageUint8;
};
// Decode data
const decode = (data) => {
const decoder = new TextDecoder();
const decodedMessage = decoder.decode(data); // Returns a string containing the text decoded
return decodedMessage;
};
Sign and Verify Message
A keypair's primary function is to sign messages and enable signature verification. Verification of a signature ensures that the data was signed by the owner of a specific private key.
sign()
— Signs the message using thesecretKey
and returns a signature.verify()
— Verifies the message's signature and returns true if it was successful or false if it was unsuccessful.
To do this, we will use the TweetNaCl library.
const nacl = require("tweetnacl");
// Sign Message
function sign(message, secretKey) {
const encodedMessage = encode(message); // Encode message using helper function
const signature = nacl.sign.detached(encodedMessage, secretKey);
return signature;
}
// Verify Message
function verify(message, signature, publicKey) {
const encodedMessage = encode(message); // Encode message using helper function
const verified = nacl.sign.detached.verify(
encodedMessage,
signature,
publicKey
);
return verified;
}
Encrypt Message
Encode the message using the encode()
helper function and then encrypt and authenticate encoded message using nacl.box()
.
nacl.box()
Parameters
message
— The encoded messagenonce
— The given noncepublicKeyB
— Peer's public keyprivateKeyA
— Our secret key (private key)
Returns an encrypted and authenticated message.
// Encrypt Message
const encrypt = (message, nonce, publicKeyB, privateKeyA) => {
const messageUint8 = encode(message); // Encode message
//encrypt and authenticate encoded message
const encrypted = nacl.box(messageUint8, nonce, publicKeyB, privateKeyA);
return encrypted;
};
Decrypt Message
Use nacl.box.open()
to authenticate and decrypt the given box with the peer's public key, our secret key, and the given nonce.
nacl.box.open()
Parameters
encrypted
— The given boxnonce
— The given noncepublicKeyA
— Peer's public keyprivateKeyB
— Our secret key (private key)
Returns the original message, or null if authentication fails.
// Decrypt Message
const decrypt = (encrypted, nonce, publicKeyA, privateKeyB) => {
const decrypted = nacl.box.open(encrypted, nonce, publicKeyA, privateKeyB); // Authenticate and decrypt
const decryptedMessage = decode(decrypted); // Decode message
return decryptedMessage;
};