Flutter加密解密插件r_crypto的使用

发布于 1周前 作者 yibo5220 来自 Flutter

Flutter加密解密插件r_crypto的使用

r_crypto 是一个支持多种哈希算法的 Flutter 插件。它利用 Rust 后端实现,比纯 Dart 实现的库更快,并且体积更小。某些算法还支持硬件加速。

支持的算法

哈希算法

  • MD5
  • SHA1
  • SHA2
    • SHA224
    • SHA256
    • SHA384
    • SHA512-trunc224
    • SHA512-trunc256
  • SHA3
    • SHA3-224
    • SHA3-256
    • SHA3-384
    • SHA3-512
    • SHAKE-128
    • SHAKE-256
    • KECCAK224
    • KECCAK256
    • KECCAK384
    • KECCAK512
  • Whirlpool
  • Blake2
    • Blake2b
    • Blake2s
  • Blake3
  • Groestl
    • Groestl224
    • Groestl256
    • Groestl384
    • Groestl512
    • GroestlBig
    • GroestlSmall
  • RIPEMD160 (RIPEMD-320 提供与 RIPEMD-160 相同的安全性)
  • Shabal
    • Shabal192
    • Shabal224
    • Shabal256
    • Shabal384
    • Shabal512

更多哈希算法将很快支持。

支持的平台

  • Android
    • arm64-v8a
    • armeabi-v7a
    • x86
    • x86_64
  • iOS
    • arm64
    • x86_64
  • macOS
    • x86_64
    • arm64(进行中)
  • Windows
    • x86_64
    • x86(目前不支持)
  • Linux
    • x86_64

示例用法

哈希

import 'package:r_crypto/r_crypto.dart';

// 对固定输出长度的哈希
rHash.hashString(HashType.MD5, input);
// 对动态输出长度的哈希
rHash.hashString(HashType.blake3(length: 64), input);
// 也接受 List<int> 参数
rHash.hashList(HashType.KECCAK_224, [0,1,2]);
// 哈希文件
rHash.filePath(HashType.blake3(length: 32), path);

// 编码列表
hex.encode(list);

注意事项

  • Windows 用户需要下载 rcrypto.dll 并将其放置在与 .exe 文件相同的文件夹中。这是当前 Flutter Windows 插件的限制。

TODO

  • ✅ 支持文件输入
  • ❌ 支持加密/解密算法

完整示例代码

import 'package:convert/convert.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:r_crypto_example/data.dart';
import 'package:r_crypto_example/file.dart';
import 'package:r_crypto_example/hash.dart';
import 'package:r_crypto_example/profile.dart';

void main() {
  runApp(DemoApp());
}

class DemoApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DemoScreen(),
    );
  }
}

class DemoScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('rCrypto Demo'),
      ),
      body: Center(
        child: ListView(
          children: [
            ListTile(
              title: Text('哈希'),
              onTap: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (_) => HashListScreen()));
              },
            ),
            ListTile(
              title: Text('配置文件'),
              onTap: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (_) => ProfileListScreen()));
              },
            ),
            ListTile(
              title: Text('文件'),
              onTap: () {
                Navigator.push(context,
                    MaterialPageRoute(builder: (_) => FileListScreen()));
              },
            ),
          ],
        ),
      ),
    );
  }
}

class HashListScreen extends StatefulWidget {
  [@override](/user/override)
  _HashListScreenState createState() => _HashListScreenState();
}

class _HashListScreenState extends State<HashListScreen> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('rCrypto 哈希'),
      ),
      body: ListView.builder(
        itemBuilder: (context, index) =>
            HashItemWidget(profileData: list[index]),
        itemCount: list.length,
      ),
    );
  }
}

class ProfileListScreen extends StatefulWidget {
  [@override](/user/override)
  _ProfileListScreenState createState() => _ProfileListScreenState();
}

class _ProfileListScreenState extends State<ProfileListScreen> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('RCrypto 配置文件'),
      ),
      body: ListView.builder(
        itemBuilder: (context, index) => ProfileItemWidget(list[index]),
        itemCount: list.length,
      ),
    );
  }
}

class FileListScreen extends StatefulWidget {
  [@override](/user/override)
  _FileListScreenState createState() => _FileListScreenState();
}

class _FileListScreenState extends State<FileListScreen> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('RCrypto 文件'),
      ),
      body: ListView.builder(
        itemBuilder: (context, index) => FileItemWidget(
          profileData: fileList[index],
        ),
        itemCount: fileList.length,
      ),
    );
  }
}

extension ListExt on List<int> {
  String toHex() => hex.encode(this);
}

更多关于Flutter加密解密插件r_crypto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter加密解密插件r_crypto的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用r_crypto插件进行加密和解密的示例代码。r_crypto是一个用于加密和解密数据的Flutter插件,它支持多种加密算法,如AES、DES、RSA等。

首先,你需要在你的pubspec.yaml文件中添加r_crypto依赖:

dependencies:
  flutter:
    sdk: flutter
  r_crypto: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,我们来看一个使用AES加密和解密的示例代码:

import 'package:flutter/material.dart';
import 'package:r_crypto/r_crypto.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Encryption/Decryption Example'),
        ),
        body: Center(
          child: EncryptionDecryptionExample(),
        ),
      ),
    );
  }
}

class EncryptionDecryptionExample extends StatefulWidget {
  @override
  _EncryptionDecryptionExampleState createState() => _EncryptionDecryptionExampleState();
}

class _EncryptionDecryptionExampleState extends State<EncryptionDecryptionExample> {
  final _key = 'your-secret-key-123456'; // 必须是16, 24, 或 32 个字节长
  String? _plaintext;
  String? _encryptedText;
  String? _decryptedText;

  void _encrypt() {
    if (_plaintext != null) {
      final aes = AES(_key!);
      final encrypted = aes.encrypt(_plaintext!, padding: Pkcs7());
      setState(() {
        _encryptedText = encrypted.base64;
      });
    }
  }

  void _decrypt() {
    if (_encryptedText != null) {
      final aes = AES(_key!);
      final encrypted = Encrypted.fromBase64(_encryptedText!);
      final decrypted = aes.decrypt(encrypted, padding: Pkcs7());
      setState(() {
        _decryptedText = decrypted.toString();
      });
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.center,
      children: <Widget>[
        TextField(
          decoration: InputDecoration(labelText: 'Plaintext'),
          onChanged: (value) {
            setState(() {
              _plaintext = value;
            });
          },
        ),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _encrypt,
          child: Text('Encrypt'),
        ),
        SizedBox(height: 20),
        Text('Encrypted Text: $_encryptedText'),
        SizedBox(height: 20),
        ElevatedButton(
          onPressed: _decrypt,
          child: Text('Decrypt'),
        ),
        SizedBox(height: 20),
        Text('Decrypted Text: $_decryptedText'),
      ],
    );
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它允许用户输入明文,然后加密它,并显示加密后的文本。用户还可以选择解密加密后的文本,并显示解密后的明文。

请注意:

  1. 加密密钥(_key)的长度必须是16、24或32个字节长,以符合AES算法的要求。
  2. 加密和解密操作使用了AES类和Pkcs7填充模式。
  3. 加密后的文本以Base64编码格式显示,因为加密后的数据通常是二进制数据,不适合直接显示。

确保在实际应用中安全地存储和管理你的密钥,并遵循最佳的安全实践来保护敏感数据。

回到顶部