flutter - 尝试在 Flutter 中使用 AES 打开加密文件
问题描述
我加密文件并将其存储在使用 AES 加密的文件夹中
名称存储在 fileName.aes 等文件夹中
但是当我尝试解密它时,我收到此消息错误:未处理的异常:FileSystemException:无法打开文件,路径 = '/storage/emulated/0/MyEncFolder/File:'/data/user/0/com.example.encryptionfiles/ cache/file_picker/Inter-Milan.jpg.aes''(操作系统错误:没有这样的文件或目录,errno = 2)
这是我的代码:
import 'dart:io';
import 'dart:typed_data';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:encrypt/encrypt.dart' as encrypt;
import 'package:fluttertoast/fluttertoast.dart';
import 'package:path_provider/path_provider.dart';
import 'package:permission_handler/permission_handler.dart';
File _file;
class Welcome extends StatefulWidget {
static String id = "Welcome";
@override
_WelcomeState createState() => _WelcomeState();
}
class _WelcomeState extends State<Welcome> {
bool _isGranted = true;
Future<Directory> get getAppDir async {
final appDocDir = await getApplicationDocumentsDirectory();
return appDocDir;
}
Future<Directory> get getExternalVisibleDir async {
if (await Directory('/storage/emulated/0/MyEncFolder').exists()) {
final externalDir = Directory('/storage/emulated/0/MyEncFolder');
return externalDir;
} else {
await Directory('/storage/emulated/0/MyEncFolder')
.create(recursive: true);
final externalDir = Directory('/storage/emulated/0/MyEncFolder');
return externalDir;
}
}
getStoragePermission() async {
if (!await Permission.storage.isGranted) {
PermissionStatus result = await Permission.storage.request();
if (result.isGranted) {
setState(() {
_isGranted = true;
});
} else {
setState(() {
_isGranted = false;
});
}
}
}
@override
Widget build(BuildContext context) {
getStoragePermission();
return Scaffold(
body: Container(
alignment: Alignment.center,
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ElevatedButton(
onPressed: () async {
if (_isGranted) {
Directory d = await getExternalVisibleDir;
FilePickerResult result = await FilePicker.platform.pickFiles();
_file = File(result.files.single.path);
_downloadAndCreate(d, _file.path.split('/').last, _file.path);
} else {
print('no permission granted');
getStoragePermission();
}
},
child: Text(
'اختار ملف للتشفير ',
style: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
),
),
SizedBox(
height: 20,
),
ElevatedButton(
onPressed: () async {
if (_isGranted) {
Directory d = await getExternalVisibleDir;
FilePickerResult result = await FilePicker.platform.pickFiles();
_file = File(result.files.single.path);
_getNormalFile(d, _file);
} else {
print('no permission granted');
getStoragePermission();
}
},
child: Text(
'فك تشفير الملف',
style: TextStyle(fontWeight: FontWeight.bold, fontSize: 20),
),
),
],
),
));
}
}
void _downloadAndCreate(Directory dir, fileName, filePath) async {
print('data downloading ...');
Fluttertoast.showToast(msg: 'data downloading ...');
var encResult = _encryptData(_file.path.codeUnits);
String p = await _writeData(encResult, dir.path + '/$fileName.aes');
print('file encrypted Successfully $p');
Fluttertoast.showToast(msg: 'تم تشفير الملف بنجاح$p');
}
_getNormalFile(Directory d, File fileNameNew) async {
Uint8List encData = await _readData(fileNameNew.readAsBytesSync());
var plainData = await _decryptData(encData);
String p = await _writeData(plainData, d.path + '/$fileNameNew');
print('file decrypted Successfully $p');
Fluttertoast.showToast(msg: 'تم فك تشفير الملف بنجاح $p');
}
Future<Uint8List> _readData(fileNameWithPath) async {
print('Reading data ...');
Fluttertoast.showToast(msg: 'قراءه البيانات ...');
return await fileNameWithPath;
}
_decryptData(encData) {
print('جاري فك التشفير ...');
Fluttertoast.showToast(msg: 'File decryption is progress...');
encrypt.Encrypted enc = new encrypt.Encrypted(encData);
return MyEncrypt.myEncrypter.decryptBytes(enc, iv: MyEncrypt.myIv);
}
_encryptData(List<int> plainString) {
print('Encrypting File...');
Fluttertoast.showToast(msg: 'جاري تشفير الملف ...');
final encrypted =
MyEncrypt.myEncrypter.encryptBytes(plainString, iv: MyEncrypt.myIv);
print("test : ${encrypted.bytes}");
return encrypted.bytes;
}
Future<String> _writeData(dataToWrite, fileNameWithPath) async {
print('كتابه البيانات ...');
Fluttertoast.showToast(msg: 'كتابه البيانات ...');
_file = File(fileNameWithPath);
await _file.writeAsBytes(dataToWrite);
return _file.absolute.toString();
}
class MyEncrypt {
static final myKey = encrypt.Key.fromUtf8('Oqbahahmeddxflutterapplication29');
static final myIv = encrypt.IV.fromUtf8('hfyrujfisoldkide');
static final myEncrypter =
encrypt.Encrypter(encrypt.AES(myKey, padding: null));
}
解决方案
推荐阅读
- c++ - 我的程序没有错误就停止了,我做错了什么?
- python - Python MySQL Connector fetchone not returning dict
- security - 虚拟机 SharePoint 2013 问题 - SpFarm.Local 为空。本地机器可能不知道 VM 上的 SharePoint?
- docker - docker compose up 后,去后端到 redis 连接被拒绝
- angular - 如何在角度应用程序中部分导入引导程序?
- r - 在 R 中对具有相似名称/前缀的列求和
- flutter - 如何在不将旧根保存在堆栈中的情况下切换到新根?
- swift - 如何在 Swift 结果生成器中恢复类型泛型类型推断?
- bash - terraform 外部数据不返回 bash 输出
- firebase - 产品信息的多语言应用程序