Flutter数据加密/解密插件dart_des的使用

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

Flutter数据加密/解密插件dart_des的使用

dart_des 是一个纯Dart实现的DES和Triple DES算法插件,它移植自pyDES。Triple DES支持两种模式:DES-EDE3(24字节密钥)和DES-EDE2(16字节密钥)。本文将详细介绍如何在Flutter项目中使用该插件进行数据的加密与解密操作,并提供完整的示例代码。

依赖安装

首先,在pubspec.yaml文件中添加dart_des作为依赖:

dependencies:
  dart_des: ^latest_version # 替换为最新版本号
  convert: ^3.0.0 # 用于十六进制和Base64编码转换

然后执行flutter pub get来安装这些包。

示例代码

下面是一个完整的示例,演示了如何使用dart_des进行DES和Triple DES的ECB、CBC模式下的加密和解密:

import 'dart:convert';
import 'package:convert/convert.dart';
import 'package:dart_des/dart_des.dart';

void main() {
  String key = '12345678'; // 8-byte for DES, 16 or 24-byte for Triple DES
  String message = 'Driving in from the edge of town';
  List<int> iv = [1, 2, 3, 4, 5, 6, 7, 8]; // Initialization Vector for CBC mode

  print('key: $key');
  print('message: $message');

  // DES ECB Mode with PKCS5 Padding
  DES desECBPKCS5 = DES(
    key: key.codeUnits,
    mode: DESMode.ECB,
    paddingType: DESPaddingType.PKCS5,
  );
  List<int> encryptedECBPKCS5 = desECBPKCS5.encrypt(message.codeUnits);
  List<int> decryptedECBPKCS5 = desECBPKCS5.decrypt(encryptedECBPKCS5);
  print('--- DES ECB PKCS5 ---');
  print('encrypted (hex): ${hex.encode(encryptedECBPKCS5)}');
  print('encrypted (base64): ${base64.encode(encryptedECBPKCS5)}');
  print('decrypted (utf8): ${utf8.decode(decryptedECBPKCS5)}');

  // DES ECB Mode without Padding
  DES desECB = DES(key: key.codeUnits, mode: DESMode.ECB);
  List<int> encryptedECB = desECB.encrypt(message.codeUnits);
  List<int> decryptedECB = desECB.decrypt(encryptedECB);
  print('--- DES ECB ---');
  print('encrypted (hex): ${hex.encode(encryptedECB)}');
  print('encrypted (base64): ${base64.encode(encryptedECB)}');
  print('decrypted (utf8): ${utf8.decode(decryptedECB)}');

  // DES CBC Mode
  DES desCBC = DES(key: key.codeUnits, mode: DESMode.CBC, iv: iv);
  List<int> encryptedCBC = desCBC.encrypt(message.codeUnits);
  List<int> decryptedCBC = desCBC.decrypt(encryptedCBC);
  print('--- DES CBC ---');
  print('encrypted (hex): ${hex.encode(encryptedCBC)}');
  print('encrypted (base64): ${base64.encode(encryptedCBC)}');
  print('decrypted (utf8): ${utf8.decode(decryptedCBC)}');

  // Triple DES ECB Mode
  key = '1234567812345678'; // 16-byte for DES-EDE2
  DES3 des3ECB = DES3(key: key.codeUnits, mode: DESMode.ECB);
  List<int> encrypted3ECB = des3ECB.encrypt(message.codeUnits);
  List<int> decrypted3ECB = des3ECB.decrypt(encrypted3ECB);
  print('--- Triple DES ECB ---');
  print('encrypted (hex): ${hex.encode(encrypted3ECB)}');
  print('encrypted (base64): ${base64.encode(encrypted3ECB)}');
  print('decrypted (utf8): ${utf8.decode(decrypted3ECB)}');

  // Triple DES CBC Mode
  key = '123456781234567812345678'; // 24-byte for DES-EDE3
  DES3 des3CBC = DES3(key: key.codeUnits, mode: DESMode.CBC, iv: iv);
  List<int> encrypted3CBC = des3CBC.encrypt(message.codeUnits);
  List<int> decrypted3CBC = des3CBC.decrypt(encrypted3CBC);
  print('--- Triple DES CBC ---');
  print('encrypted (hex): ${hex.encode(encrypted3CBC)}');
  print('encrypted (base64): ${base64.encode(encrypted3CBC)}');
  print('decrypted (utf8): ${utf8.decode(decrypted3CBC)}');
}

运行结果

当你运行上述代码时,将会输出不同模式下加密后的十六进制字符串、Base64编码以及解密后的原始消息。这有助于理解每种模式的具体行为及其适用场景。

注意事项

  • 安全性:虽然本示例展示了多种加解密方式,但在实际应用中应避免使用弱密码或硬编码密钥。同时,尽量选择更安全的加密算法如AES。
  • 初始化向量(IV):对于CBC模式而言,确保每次加密时都使用不同的随机IV可以增加安全性。
  • 填充方式:在某些情况下可能需要指定特定的填充类型以保证兼容性,例如PKCS5填充。

通过以上内容,你应该能够掌握如何在Flutter应用程序中使用dart_des来进行基本的数据加密和解密操作。如果有任何疑问或者遇到问题,请随时查阅官方文档或寻求社区帮助。


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

1 回复

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


当然,下面是一个关于如何在Flutter中使用dart_des插件进行数据加密和解密的代码示例。dart_des是一个用于DES(Data Encryption Standard)加密算法的Dart库,可以在Flutter项目中用于数据加密和解密。

首先,确保你已经将dart_des插件添加到你的pubspec.yaml文件中:

dependencies:
  flutter:
    sdk: flutter
  dart_des: ^1.0.0  # 请检查最新版本号

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

接下来,是一个简单的Flutter应用程序示例,展示了如何使用dart_des进行数据加密和解密:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter DES Encryption/Decryption Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: DesDemo(),
    );
  }
}

class DesDemo extends StatefulWidget {
  @override
  _DesDemoState createState() => _DesDemoState();
}

class _DesDemoState extends State<DesDemo> {
  final TextEditingController _textController = TextEditingController();
  final TextEditingController _keyController = TextEditingController();
  String _encryptedText = '';
  String _decryptedText = '';

  void _encryptText() {
    String text = _textController.text;
    String key = _keyController.text;

    if (text.isEmpty || key.isEmpty || key.length != 8) {
      // DES密钥必须是8个字符长
      _showSnackBar('Please enter a valid text and 8-character key.');
      return;
    }

    DES des = DES(key);
    String encrypted = des.encryptECB(text);
    
    setState(() {
      _encryptedText = encrypted;
      _decryptedText = ''; // Clear decrypted text
    });
  }

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

    if (encryptedText.isEmpty || key.isEmpty || key.length != 8) {
      _showSnackBar('Please enter a valid encrypted text and 8-character key.');
      return;
    }

    DES des = DES(key);
    String decrypted = des.decryptECB(encryptedText);

    setState(() {
      _decryptedText = decrypted;
    });
  }

  void _showSnackBar(String message) {
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(message),
        duration: Duration(seconds: 2),
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('DES Encryption/Decryption Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: <Widget>[
            TextField(
              controller: _textController,
              decoration: InputDecoration(labelText: 'Text to Encrypt'),
              maxLines: 4,
            ),
            TextField(
              controller: _keyController,
              decoration: InputDecoration(
                labelText: '8-character Key',
                suffixIcon: IconButton(
                  icon: Icon(Icons.info_outline),
                  onPressed: () {
                    _showSnackBar('DES requires an 8-character key.');
                  },
                ),
              ),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: _encryptText,
              child: Text('Encrypt'),
            ),
            SizedBox(height: 8),
            ElevatedButton(
              onPressed: _decryptText,
              child: Text('Decrypt'),
            ),
            SizedBox(height: 16),
            Text('Encrypted Text: $_encryptedText'),
            SizedBox(height: 8),
            Text('Decrypted Text: $_decryptedText'),
          ],
        ),
      ),
    );
  }
}

代码解释

  1. 依赖管理

    • pubspec.yaml中添加dart_des依赖。
  2. UI构建

    • 使用MaterialAppScaffold构建基本的Flutter应用结构。
    • 使用TextField接收用户输入的文本和密钥。
    • 使用ElevatedButton触发加密和解密操作。
    • 使用Text显示加密后的文本和解密后的文本。
  3. 加密和解密逻辑

    • _encryptText方法:获取用户输入的文本和密钥,使用DES类进行ECB模式的加密,并更新状态以显示加密后的文本。
    • _decryptText方法:获取加密后的文本和密钥,使用DES类进行ECB模式的解密,并更新状态以显示解密后的文本。
    • _showSnackBar方法:用于显示提示信息。

注意事项

  • DES算法使用8个字符长的密钥。
  • ECB模式(电子密码本模式)是最简单的分组密码加密模式,但不适合用于加密大量数据,因为它不使用初始化向量(IV),可能导致相同的明文块产生相同的密文块。

这个示例是一个简单的演示,实际项目中可能需要考虑更安全的加密方式,比如AES,以及适当的密钥管理和初始化向量使用。

回到顶部