Flutter加密解密插件sm_crypto的使用

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

Flutter加密解密插件sm_crypto的使用

sm_crypto 是一个支持SM2、SM3和SM4等国家密码算法的Dart库。本文将介绍如何在Flutter项目中使用该插件进行数据的加密和解密操作。

安装

首先,你需要在你的Flutter项目中添加 sm_crypto 依赖。可以通过以下命令来安装:

使用Dart

dat pub add sm_crypto

使用Flutter

flutter pub add sm_crypto

这将在你的项目的 pubspec.yaml 文件中自动添加如下依赖,并运行 dart pub get

dependencies:
  sm_crypto: ^1.0.3

导入

在你的Dart代码中导入 sm_crypto 库:

import 'package:sm_crypto/sm_crypto.dart';

使用示例

SM3 加密

SM3是一种哈希算法,用于生成数据的摘要。下面是一个简单的例子:

void sm3Example() {
  String data = 'Hello! SM-CRYPTO @Greenking19';
  String sm3Encrypt = SM3.encryptString(data);
  print('👇 SM3 Encrypt Data:');
  print(sm3Encrypt);
}

SM4 加密与解密

SM4是一种分组加密算法,支持ECB和CBC两种模式。以下是使用SM4进行加密和解密的例子:

ECB模式

void sm4ExampleECB() {
  String key = SM4.createHexKey(key: '1234567890987654');
  String data = 'Hello! SM-CRYPTO @greenking19';
  
  // 加密
  String ebcEncryptData = SM4.encrypt(data: data, key: key);
  print('🔒 EBC EncryptptData:\n $ebcEncryptData');
  
  // 解密
  String ebcDecryptData = SM4.decrypt(data: ebcEncryptData, key: key);
  print('🔑 EBC DecryptData:\n $ebcDecryptData');
}

CBC模式

void sm4ExampleCBC() {
  String key = SM4.createHexKey(key: '1234567890987654');
  String iv = SM4.createHexKey(key: '1234567890987654'); // 初始化向量
  String data = 'Hello! SM-CRYPTO @greenking19';
  
  // 加密
  String cbcEncryptData = SM4.encrypt(
    data: data,
    key: key,
    mode: SM4CryptoMode.CBC,
    iv: iv,
  );
  print('🔒 CBC EncryptptData:\n $cbcEncryptData');
  
  // 解密
  String cbcDecryptData = SM4.decrypt(
    data: cbcEncryptData,
    key: key,
    mode: SM4CryptoMode.CBC,
    iv: iv,
  );
  print('🔑 CBC DecryptData:\n $cbcDecryptData');
}

主函数调用示例

void main() {
  sm3Example();
  sm4ExampleECB();
  sm4ExampleCBC();
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用sm_crypto插件进行加密和解密的代码示例。sm_crypto是一个流行的Flutter插件,用于处理各种加密和解密操作,包括对称加密(如AES)和非对称加密(如RSA)。

首先,确保你已经在pubspec.yaml文件中添加了sm_crypto依赖:

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

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

接下来,以下是一个简单的示例代码,展示如何使用sm_crypto进行AES加密和解密:

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

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

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String originalText = "Hello, Flutter!";
  String encryptedText = "";
  String decryptedText = "";

  @override
  void initState() {
    super.initState();
    _encryptText();
  }

  void _encryptText() async {
    // 生成一个随机的AES密钥和IV(初始化向量)
    final aesKey = AesKey.fromSecureRandom(32); // 256位密钥
    final aesIV = AesIV.fromSecureRandom(16); // 128位IV

    // 创建AES加密实例
    final aesEncrypter = AesEncrypter(aesKey);
    final aesEncryption = aesEncrypter.encrypt(originalText, iv: aesIV);

    // 将加密结果转换为Base64字符串以便于显示
    setState(() {
      encryptedText = aesEncryption.base64;
    });

    // 解密以验证加密结果
    final decrypted = aesEncrypter.decrypt64(aesEncryption.base64, iv: aesIV);
    setState(() {
      decryptedText = decrypted;
    });

    // 打印结果到控制台
    print("Original Text: $originalText");
    print("Encrypted Text (Base64): $encryptedText");
    print("Decrypted Text: $decryptedText");
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter AES Encryption/Decryption Example'),
        ),
        body: Padding(
          padding: const EdgeInsets.all(16.0),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              Text('Original Text:', style: TextStyle(fontWeight: FontWeight.bold)),
              Text(originalText),
              SizedBox(height: 16),
              Text('Encrypted Text (Base64):', style: TextStyle(fontWeight: FontWeight.bold)),
              Text(encryptedText),
              SizedBox(height: 16),
              Text('Decrypted Text:', style: TextStyle(fontWeight: FontWeight.bold)),
              Text(decryptedText),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. 我们首先生成了一个随机的AES密钥和IV(初始化向量)。
  2. 使用AesEncrypter类创建一个加密实例,并使用encrypt方法对原始文本进行加密。
  3. 将加密结果转换为Base64字符串以便于显示。
  4. 使用decrypt64方法对加密的Base64字符串进行解密,以验证加密结果。
  5. 使用setState方法更新UI,显示原始文本、加密文本和解密文本。

请注意,实际项目中应妥善管理密钥和IV,不要将它们硬编码在代码中,特别是在客户端应用程序中。通常,密钥管理涉及到服务器端的安全存储和分发。

回到顶部