o1js
Version:
TypeScript framework for zk-SNARKs and zkApps
91 lines (71 loc) • 2.13 kB
text/typescript
import {
Encryption,
Encoding,
PrivateKey,
Provable,
initializeBindings,
} from 'o1js';
await initializeBindings();
// generate keys
let privateKey = PrivateKey.random();
let publicKey = privateKey.toPublicKey();
// message
let message = 'This is a secret.';
let messageFields = Encoding.stringToFields(message);
// encrypt
let cipherText = Encryption.encrypt(messageFields, publicKey);
// decrypt
let decryptedFields = Encryption.decrypt(cipherText, privateKey);
let decryptedMessage = Encoding.stringFromFields(decryptedFields);
if (decryptedMessage !== message) throw Error('decryption failed');
console.log(`Original message: "${message}"`);
console.log(`Recovered message: "${decryptedMessage}"`);
// the same but in a checked computation
await Provable.runAndCheck(() => {
// encrypt
let cipherText = Encryption.encrypt(messageFields, publicKey);
// decrypt
let decryptedFields = Encryption.decrypt(cipherText, privateKey);
messageFields.forEach((m, i) => {
m.assertEquals(decryptedFields[i]);
});
});
// With a longer message
message = JSON.stringify({
coinbase: {
btc: 40000.0,
eth: 3000.0,
usdc: 1.0,
ada: 1.02,
avax: 70.43,
mina: 2.13,
},
binance: {
btc: 39999.0,
eth: 3001.0,
usdc: 1.01,
ada: 0.99,
avax: 70.21,
mina: 2.07,
},
});
messageFields = Encoding.stringToFields(message);
// encrypt
cipherText = Encryption.encrypt(messageFields, publicKey);
// decrypt
decryptedFields = Encryption.decrypt(cipherText, privateKey);
decryptedMessage = Encoding.stringFromFields(decryptedFields);
if (decryptedMessage !== message) throw Error('decryption failed');
console.log(`Original message: "${message}"`);
console.log(`Recovered message: "${decryptedMessage}"`);
// the same but in a checked computation
await Provable.runAndCheck(() => {
// encrypt
let cipherText = Encryption.encrypt(messageFields, publicKey);
// decrypt
let decryptedFields = Encryption.decrypt(cipherText, privateKey);
messageFields.forEach((m, i) => {
m.assertEquals(decryptedFields[i]);
});
});
console.log('everything works!');