Flutter数据加密插件encrypto_flutter的使用

Flutter数据加密插件encrypto_flutter的使用

关于项目

End to End 加密(RSA e2ee)适用于多种语言(跨平台),并且特别为本地文件加密提供了值密码保护(DES 加密)!

目录

图标 项目
📺 预览
🥳 即将推出
⚖️ 许可

使用(Flutter/Dart)

实现

pubspec.yaml
encrypto_flutter: lastest

RSA

RSA 初始化
Encrypto encrypto = Encrypto(Encrypto.RSA); // 或者 Encrypto(Encrypto.RSA, bitLength: 1024) 或者 Encrypto(Encrypto.RSA, pw: 'foofoo78')
// 这将生成用于e2ee的公钥和私钥,或者初始化DES加密
RSA 加密
String val = "alo";
String base64encrypted = encrypto.encrypt(val, publicKey);
// 作为第二个参数传递公钥是RSA加密的必要条件
RSA 解密
String decrypted = encrypto.decrypt(base64encrypted);
// 打印解密后的消息,即 "alo"
RSA 其他方法
序号 方法 信息
1 Encrypto.dart / getPublicKey() 返回生成的ZotPublicKey
2 Encrypto.dart / desterilizePublicKey() 静态方法,将ZotPublicKey字符串转换为ZotPublicKey
3 Encrypto.dart / sterilizePublicKey() 返回一个可以发送给其他人的ZotPublicKey字符串
4 Encrypto.dart / getPrivateKeyString() 和 getPublicKeyString() 返回私钥/公钥的指数和模数的纯文本
5 Encrypto.dart / encrypt(String value, ZotPublicKey publicKey) 用于使用RSA加密字符串
6 Encrypto.dart / public String decrypt(String value) 用于使用密码或ZotPrivateKey解密字符串(无需传递ZotPrivateKey或密码作为参数)
7 ZotPublicKey.dart / public String sterilizePublicKey() 和 public String encrypt(byte[] val) 同上表第3和第5项
8 ZotPrivateKey.dart / public String decrypt(byte[] decode) 同上表第7项

DES

注意:DES可能在版本1.*中抛出错误
DES 初始化
Encrypto encrypto = new Encrypto(Encrypto.DES, "the moon is scary sometimes");
// 必须将密码作为第二个参数传递以进行DES加密
// 建议传递密码的哈希值而不是明文
DES 加密
String base64DESencrypted = encrypto.encrypt("alo");
// 第二个参数不传递或传递null
DES 解密
String decrypted = encrypto.decrypt(base64DESencrypted);
// 您将获得原始文本

即将推出

支持的语言 状态
Rust 待定
JavaScript 待定

预览

[]

许可

点击 这里 查看许可


示例代码

example/lib/main.dart

import 'dart:developer';

import 'package:encrypto_flutter/encrypto_flutter.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String encryptedString = '', decyptedString = '';
  bool _isEditingText = true;
  late List<TextEditingController> controllers;
  late Encrypto encrypto;

  [@override](/user/override)
  void initState() {
    controllers = [];
    for (int i = 0; i < 3; i++) {
      controllers.add(TextEditingController());
    }

    encrypto = Encrypto(Encrypto.RSA, bitLength: 128);
    log(encrypto.sterilizePublicKey()); // 在测试时输入此内容到第一个字段
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Column(
          children: [
            _editTitleTextField(0), // 输入ZotPublicKey sterilized字符串
            _editTitleTextField(1), // 输入要加密的消息
            _editTitleTextField(2), // 输入要解密的加密消息
            ElevatedButton(
                onPressed: () {
                  // 使用自动生成的公钥加密消息
                  //
                  // 您还可以通过以下方式生成要发送给客户端的base64公钥字符串:
                  // var publicKeyToBeSent = encrypto.sterilizePublicKey();
                  // print(publicKeyToBeSent); // 打印 eyJwZSI6OTIyMzM3MjAzNjg1NDc3NTgwNywib24iOjkyMjMzNzIwMzY4NTQ3NzU4MDd9
                  //
                  // 为了反序列化客户的公钥,您可以使用:
                  // 现在您可以像这样使用此公钥进行加密:
                  setState(() {
                    if (controllers[2].text.isNotEmpty) {
                      decyptedString = encrypto.decrypt(controllers[2].text);
                      encryptedString = '';
                    }
                    if (controllers[1].text.isNotEmpty) {
                      if (controllers[0].text.isNotEmpty) {
                        encryptedString = encrypto.encrypt(controllers[1].text,
                            publicKey: Encrypto.desterilizePublicKey(
                                controllers[0].text));
                      } else {
                        encryptedString = encrypto.encrypt(controllers[1].text,
                            publicKey: encrypto.getPublicKey());
                      }
                    }
                  });
                },
                child: const Text("Encrypt and Decrypt")),
            ElevatedButton(
              child: Text(encryptedString.isNotEmpty && decyptedString.isNotEmpty
                  ? 'Decrypted: $decyptedString\nEncrypted: $encryptedString'
                  : encryptedString.isEmpty
                      ? 'Decrypted: $decyptedString'
                      : 'Encrypted: $encryptedString'),
              onPressed: () {
                Clipboard.setData(ClipboardData(
                    text: encryptedString.isNotEmpty && decyptedString.isNotEmpty
                        ? 'Decrypted: $decyptedString Encrypted: $encryptedString'
                        : encryptedString.isEmpty
                            ? decyptedString
                            : encryptedString));
              },
            ),
          ],
        ),
      ),
    );
  }

  Widget _editTitleTextField(int i) {
    if (_isEditingText) {
      return Center(
        child: TextField(
          onSubmitted: (newValue) {
            setState(() {
              encryptedString = newValue;
              _isEditingText = false;
            });
          },
          autofocus: true,
          controller: controllers[i],
        ),
      );
    }
    return InkWell(
        onTap: () {
          setState(() {
            _isEditingText = true;
          });
        },
        child: Text(
          encryptedString,
          style: const TextStyle(
            color: Colors.black,
            fontSize: 18.0,
          ),
        ));
  }
}

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

1 回复

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


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

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

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

然后运行flutter pub get来获取依赖。

接下来是一个完整的示例,展示如何使用AES算法进行数据加密和解密:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Encrypto Flutter Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: EncryptoExample(),
        ),
      ),
    );
  }
}

class EncryptoExample extends StatefulWidget {
  @override
  _EncryptoExampleState createState() => _EncryptoExampleState();
}

class _EncryptoExampleState extends State<EncryptoExample> {
  final TextEditingController _keyController = TextEditingController();
  final TextEditingController _plainTextController = TextEditingController();
  String _encryptedText = '';
  String _decryptedText = '';

  void _encrypt() async {
    String key = _keyController.text;
    String plainText = _plainTextController.text;

    if (key.isEmpty || plainText.isEmpty) {
      _encryptedText = 'Key and plain text are required.';
      return;
    }

    try {
      final encrypto = Encrypto();
      String encrypted = await encrypto.aesEncrypt(plainText, key);
      setState(() {
        _encryptedText = encrypted;
        _decryptedText = '';
      });
    } catch (e) {
      _encryptedText = 'Error during encryption: $e';
    }
  }

  void _decrypt() async {
    String key = _keyController.text;
    String encryptedText = _encryptedText;

    if (key.isEmpty || encryptedText.isEmpty) {
      _decryptedText = 'Key and encrypted text are required.';
      return;
    }

    try {
      final encrypto = Encrypto();
      String decrypted = await encrypto.aesDecrypt(encryptedText, key);
      setState(() {
        _decryptedText = decrypted;
      });
    } catch (e) {
      _decryptedText = 'Error during decryption: $e';
    }
  }

  @override
  Widget build(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: <Widget>[
        TextField(
          controller: _keyController,
          decoration: InputDecoration(labelText: 'Encryption Key'),
        ),
        SizedBox(height: 16),
        TextField(
          controller: _plainTextController,
          decoration: InputDecoration(labelText: 'Plain Text'),
          maxLines: 5,
        ),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: _encrypt,
          child: Text('Encrypt'),
        ),
        SizedBox(height: 16),
        Text('Encrypted Text:'),
        Text(_encryptedText, style: TextStyle(color: Colors.grey)),
        SizedBox(height: 16),
        ElevatedButton(
          onPressed: _decrypt,
          child: Text('Decrypt'),
        ),
        SizedBox(height: 16),
        Text('Decrypted Text:'),
        Text(_decryptedText, style: TextStyle(color: Colors.grey)),
      ],
    );
  }
}

解释

  1. 依赖添加:在pubspec.yaml文件中添加encrypto_flutter依赖。
  2. 界面构建:使用MaterialAppScaffold构建一个简单的用户界面,包含输入密钥和明文、加密按钮、显示加密结果、解密按钮和显示解密结果的区域。
  3. 加密和解密逻辑
    • 使用Encrypto类的aesEncrypt方法进行加密。
    • 使用Encrypto类的aesDecrypt方法进行解密。
    • 捕获并处理可能的异常。

注意事项

  • 确保你使用的密钥长度符合AES算法的要求(例如,16、24或32字节)。
  • 加密和解密使用的是相同的密钥。
  • 加密后的文本通常是不可读的二进制数据,但这里为了简单起见,直接将其显示为字符串。在实际应用中,你可能需要进行适当的编码(如Base64)以便存储和传输。

希望这个示例能帮你更好地理解如何在Flutter项目中使用encrypto_flutter插件进行数据加密和解密。

回到顶部