Build Status Github Stars MIT License

Rusty ChaCha Banner

Rusty ChaCha 💃🦀

A Flutter library for fast ChaCha20-Poly1305 encryption, leveraging the capabilities of the Rust chacha20poly1305 crate.

🚧 Under Development: Not recommended for production use yet. 🚧


Features

Blazingly fast 🔥

Thanks to Rust encryption and decryption with ChaCha20-Poly1305 run at 500-1000 MiB/s. This is up to 50x faster than packages like cryptography_flutter or pointycastle.

Getting Started

  • With Flutter, run flutter pub add rusty_chacha

Usage

import 'dart:typed_data';
import 'package:collection/collection.dart';
import 'package:rusty_chacha/rusty_chacha.dart';

main() async {
  
  final data = Uint8List.fromList([1, 2, 3, 4, 5]);


  // Create and use a ChaCha20Poly1305 cipher with a random key:
  RustyChaCha20Poly1305 cipher = await RustyChaCha.create();
  Uint8List myEncryptedData = await cipher.encrypt(cleartext: data);
  Uint8List decrypted1 = await cipher.decrypt(ciphertext: myEncryptedData);

  assert(const ListEquality().equals(data, decrypted1));


  // Or with explicit key:
  Uint8List key = await RustyChaCha20Poly1305.generateKey();
  cipher = await RustyChaCha.create(key: key);


  // Compression example:
  // If compression is used during encryption, it also has to be set for decryption!
  // However compressionLevel does not matter.
  cipher = await RustyChaCha.create(
    key: key,
    compression: const Compression.zstd(compressionLevel: 3), // moderate compression
  );
  Uint8List myCompressedAndEncryptedData = await cipher.encrypt(cleartext: data);
  Uint8List decrypted2 = await cipher.decrypt(ciphertext: myCompressedAndEncryptedData);

  assert(const ListEquality().equals(data, decrypted2));


  // AAD example:
  cipher = await RustyChaCha.create();
  Uint8List additionalData = Uint8List.fromList([1, 2, 3]); // some additional (non-secret) data
  Uint8List myEncryptedDataWithAad = await cipher.encrypt(
    cleartext: data,
    aad: additionalData, // pass it in when encrypting
  );
  Uint8List decrypted3 = await cipher.decrypt(
    ciphertext: myEncryptedDataWithAad,
    aad: additionalData, // pass it in to decrypt (decrypt will fail if additionalData is not the same)
  );

  assert(const ListEquality().equals(data, decrypted3));


  // Create and use a XChaCha20Poly1305 with an extended 192-bit (24-byte) nonce instead of 96-bit (12-byte):
  RustyXChaCha20Poly1305 cipherX = await RustyChaCha.createX();
  Uint8List myEncryptedData2 = await cipher.encrypt(cleartext: data);
  Uint8List decrypted4 = await cipher.decrypt(ciphertext: myEncryptedData2);

  assert(const ListEquality().equals(data, decrypted4));
}

Supported platforms (for now)

  • iOS
  • MacOS
  • Windows
  • Linux

Thanks to

Libraries

rusty_chacha