native-crypto/README.md

134 lines
3.0 KiB
Markdown

# NativeCrypto
Fast crypto functions for Flutter.
* Table of content
- [Why](#why)
- [Performances](#performances)
- [How](#how)
- [Todo](#todo)
- [Installation](#installation)
- [Usage](#usage)
- [Example](#example)
## Why 🤔
Because I faced a performance issue when I was using **PointyCastle**.
It's quite simple, judge for yourself, these are times for AES256 encryption on an Android device (**Huawei P30 Pro**).
| Size | PointyCastle |
|------|--------------|
| 100 kB | 190 ms
| 200 kB | 314 ms
| 300 kB | 1138 ms
| 400 kB | 2781 ms
| 500 kB | 4691 ms
| 600 kB | 7225 ms
| 700 kB | 10264 ms
| 800 kB | 13582 ms
| 900 kB | 17607 ms
> We notice that these times, in addition to being far too big, are not even linear.
## Performances ⏱
On an Android device: **Huawei P30 Pro / Android 10**
| Size | NativeCrypto |
|------|--------------|
| 1 mB | 27 ms
| 2 mB | 43 ms
| 3 mB | 78 ms
| 4 mB | 93 ms
| 5 mB | 100 ms
| 10 mB | 229 ms
| 50 mB | 779 ms
## How 🔬
Using the native implementation of the crypto libs available on each OS.
For Android:
* [javax.crypto](https://docs.oracle.com/javase/7/docs/api/javax/crypto/package-summary.html)
* [java.security](https://docs.oracle.com/javase/7/docs/api/java/security/package-summary.html)
For iOS:
* [CommonCrypto](https://developer.apple.com/library/archive/documentation/Security/Conceptual/cryptoservices/Introduction/Introduction.html)
## Todo 🚀
- [x] Implement working cross platform AES encryption/decryption.
- [x] Different key sizes support.
- [x] Improve performances.
- [ ] Add exceptions.
- [ ] PBKDF2 support.
- [ ] Add other ciphers.
- [ ] ... add asym crypto support.
## Installation 🚧
Just add these lines in your **pubspec.yaml**:
```
native_crypto:
git:
url: https://gogs.pointcheval.fr/hugo/native-crypto-flutter.git
ref: v0.0.x
```
> And replace "x" with the current version!
Then in your code:
```dart
// Symmetric crypto.
import 'package:native_crypto/symmetric_crypto.dart';
// To handle exceptions.
import 'package:native_crypto/exceptions.dart';
```
## Usage 🎯
To create an AES instance, and generate a key.
```dart
AES aes = AES();
await aes.init(KeySize.bits256)
```
You can also generate key, then use it in AES.
```dart
Uint8List aeskey = await KeyGenerator().secretKey(keySize: KeySize.bits256);
AES aes = AES(key: aeskey);
```
You can create a key with PBKDF2.
```dart
Uint8List key = await KeyGenerator().pbkdf2(password, salt, keyLength: 32, iteration: 10000);
AES aes = AES(key: key);
```
Then you can encrypt/decrypt data with this instance.
```dart
encryptedPayload = await aes.encrypt(data);
decryptedPayload = await aes.decrypt(encryptedPayload);
```
Or you can also use AES on the fly with different keys.
```dart
Uint8List aeskey = await KeyGenerator().secretKey(keySize: KeySize.bits256);
encryptedPayload = await AES().encrypt(data, key: aeskey);
decryptedPayload = await AES().decrypt(encryptedPayload, key: aeskey);
```
## Example 📐
Look in **example/lib/** for an example app.