Flutter加密解密插件r_crypto的使用
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应用,它允许用户输入明文,然后加密它,并显示加密后的文本。用户还可以选择解密加密后的文本,并显示解密后的明文。
请注意:
- 加密密钥(
_key
)的长度必须是16、24或32个字节长,以符合AES算法的要求。 - 加密和解密操作使用了
AES
类和Pkcs7
填充模式。 - 加密后的文本以Base64编码格式显示,因为加密后的数据通常是二进制数据,不适合直接显示。
确保在实际应用中安全地存储和管理你的密钥,并遵循最佳的安全实践来保护敏感数据。