docs: update readme

This commit is contained in:
Hugo Pointcheval 2022-05-25 21:33:51 +02:00
parent ff6af2491a
commit f592799970
Signed by: hugo
GPG Key ID: A9E8E9615379254F
7 changed files with 159 additions and 2 deletions

110
README.md
View File

@ -1,3 +1,109 @@
# NativeCrypto
<p align="center">
<img width="700px" src="resources/native_crypto.png" style="background-color: rgb(255,255,255)">
<h5 align="center">Fast and powerful cryptographic functions for Flutter.</h5>
</p>
Fast and powerful cryptographic functions thanks to **javax.crypto** , **CommonCrypto** and **CryptoKit**.
<p align="center">
<a href="https://git.wyatt-studio.fr/Wyatt-FOSS/wyatt-packages/src/branch/master/packages/wyatt_analysis">
<img src="https://img.shields.io/badge/Style-Wyatt%20Analysis-blue.svg?style=flat-square" alt="Style: Wyatt Analysis" />
</a>
<a href="https://github.com/invertase/melos">
<img src="https://img.shields.io/badge/Maintained%20with-melos-f700ff.svg?style=flat-square" alt="Maintained with Melos" />
</a>
</p>
---
[[Changelog]](./CHANGELOG.md) | [[License]](./LICENSE)
---
## About
The goal of this plugin is to provide a fast and powerful cryptographic functions by calling native libraries. On Android, it uses [javax.cypto](https://developer.android.com/reference/javax/crypto/package-summary), and on iOS, it uses [CommonCrypto](https://opensource.apple.com/source/CommonCrypto/) and [CryptoKit](https://developer.apple.com/documentation/cryptokit/)
I started this projet because I wanted to add cryptographic functions on a Flutter app. But I faced a problem with the well-known [Pointy Castle](https://pub.dev/packages/pointycastle) library: the performance was very poor. Here some benchmarks and comparison:
![](resources/benchmarks.png)
For comparison, on a *iPhone 13*, you can encrypt/decrypt a message of **2MiB** in **~5.6s** with PointyCastle and in **~40ms** with NativeCrypto. And on an *OnePlus 5*, you can encrypt/decrypt a message of **50MiB** in **~6min30** with PointyCastle and in less than **~1s** with NativeCrypto.
In short, NativeCrypto is incomparable with PointyCastle.
## Usage
First, check compatibility with your targets.
| iOS | Android | MacOS | Linux | Windows | Web |
| --- | ------- | ----- | ----- | ------- | --- |
| ✅ | ✅ | ❌ | ❌ | ❌ | ❌ |
#### Hash
To digest a message, you can use the following function:
```dart
Uint8List hash = await HashAlgorithm.sha256.digest(message);
```
Note that you can find a `toBytes()` method in the example app, to convert a `String` to a `Uint8List`.
> In NativeCrypto, you can use the following hash functions: SHA-256, SHA-384, SHA-512
#### Keys
You can build a `SecretKey` from a utf8, base64, base16 (hex) strings or raw bytes. You can also generate a SecretKey from secure random.
```dart
SecretKey secretKey = SecretKey(Uint8List.fromList([0x73, 0x65, 0x63, 0x72, 0x65, 0x74]));
SecretKey secretKey = SecretKey.fromUtf8('secret');
SecretKey secretKey = SecretKey.fromBase64('c2VjcmV0');
SecretKey secretKey = SecretKey.fromBase16('63657274');
SecretKey secretKey = await SecretKey.fromSecureRandom(256);
```
#### Key derivation
You can derive a `SecretKey` using **PBKDF2**.
First, you need to initialize a `Pbkdf2` object.
```dart
Pbkdf2 pbkdf2 = Pbkdf2(32, 1000, algorithm: HashAlgorithm.sha512);
```
Then, you can derive a `SecretKey` from a password and salt.
```dart
SecretKey secretKey = await pbkdf2.derive(password: password, salt: 'salt');
```
> In NativeCrypto, you can use the following key derivation function: PBKDF2
#### Cipher
And now, you can use the `SecretKey` to encrypt/decrypt a message.
First, you need to initialize a `Cipher` object.
```dart
AES cipher = AES(secretKey, AESMode.gcm);
```
Then, you can encrypt/decrypt your message.
```dart
CipherText encrypted = await cipher.encrypt(message);
Uint8List decrypted = await cipher.decrypt(encrypted);
```
After an encryption, you can use the `CipherText` object to access underlying data.
```dart
Uint8List iv = encrypted.iv;
Uint8List data = encrypted.data;
Uint8List tag = encrypted.tag;
```
Note that data and tag are costly to access, so you should only use them if you need to !

View File

@ -0,0 +1,14 @@
Run;Size (B);Encryption Time (ms);Decryption Time (ms)
1;2097152;48;64
2;6291456;52;52
3;10485760;105;83
4;14680064;96;198
5;18874368;116;143
6;23068672;253;257
7;27262976;164;213
8;31457280;271;270
9;35651584;339;356
10;39845888;316;320
11;44040192;370;412
12;48234496;425;368
13;52428800;430;402
1 Run Size (B) Encryption Time (ms) Decryption Time (ms)
2 1 2097152 48 64
3 2 6291456 52 52
4 3 10485760 105 83
5 4 14680064 96 198
6 5 18874368 116 143
7 6 23068672 253 257
8 7 27262976 164 213
9 8 31457280 271 270
10 9 35651584 339 356
11 10 39845888 316 320
12 11 44040192 370 412
13 12 48234496 425 368
14 13 52428800 430 402

View File

@ -0,0 +1,14 @@
Run;Size (B);Encryption Time (ms);Decryption Time (ms)
1;2097152;20;16
2;6291456;13;13
3;10485760;16;22
4;14680064;23;37
5;18874368;21;48
6;23068672;34;45
7;27262976;38;72
8;31457280;59;72
9;35651584;70;74
10;39845888;61;85
11;44040192;80;92
12;48234496;90;113
13;52428800;79;111
1 Run Size (B) Encryption Time (ms) Decryption Time (ms)
2 1 2097152 20 16
3 2 6291456 13 13
4 3 10485760 16 22
5 4 14680064 23 37
6 5 18874368 21 48
7 6 23068672 34 45
8 7 27262976 38 72
9 8 31457280 59 72
10 9 35651584 70 74
11 10 39845888 61 85
12 11 44040192 80 92
13 12 48234496 90 113
14 13 52428800 79 111

View File

@ -0,0 +1,9 @@
size;encryption time;encode time;decryption time;crypto time
2000000;7764;7302;0
4000000;14720;14580;0
8000000;29421;29037;0
16000000;58874;58304;0
32000000;117964;116570;0
64000000;235122;232923;0
128000000;469697;466278;0
256000000;0;0;0
1 size;encryption time;encode time;decryption time;crypto time
2 2000000;7764;7302;0
3 4000000;14720;14580;0
4 8000000;29421;29037;0
5 16000000;58874;58304;0
6 32000000;117964;116570;0
7 64000000;235122;232923;0
8 128000000;469697;466278;0
9 256000000;0;0;0

View File

@ -0,0 +1,14 @@
Run;Size (B);Encryption Time (ms);Decryption Time (ms)
1;2097152;2420;2289
2;6291456;7118;7369
3;10485760;12766;13051
4;14680064;18594;19029
5;18874368;27449;27927
6;23068672;34093;33863
7;27262976;39855;39981
8;31457280;46359;46089
9;35651584;52596;52375
10;39845888;59151;58881
11;44040192;65914;65590
12;48234496;71908;72099
13;52428800;79202;78571
1 Run Size (B) Encryption Time (ms) Decryption Time (ms)
2 1 2097152 2420 2289
3 2 6291456 7118 7369
4 3 10485760 12766 13051
5 4 14680064 18594 19029
6 5 18874368 27449 27927
7 6 23068672 34093 33863
8 7 27262976 39855 39981
9 8 31457280 46359 46089
10 9 35651584 52596 52375
11 10 39845888 59151 58881
12 11 44040192 65914 65590
13 12 48234496 71908 72099
14 13 52428800 79202 78571

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

BIN
resources/benchmarks.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB