crypto_util.dart 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import 'dart:typed_data';
  2. import 'dart:io' as io;
  3. import 'package:aes_crypt/aes_crypt.dart';
  4. import 'package:computer/computer.dart';
  5. import 'package:encrypt/encrypt.dart';
  6. import 'package:photos/core/configuration.dart';
  7. import 'package:steel_crypt/steel_crypt.dart' as steel;
  8. import 'package:uuid/uuid.dart';
  9. class CryptoUtil {
  10. static Uint8List getSecureRandomBytes({int length = 32}) {
  11. return SecureRandom(length).bytes;
  12. }
  13. static String getSecureRandomString({int length = 32}) {
  14. return SecureRandom(length).utf8;
  15. }
  16. static Uint8List scrypt(Uint8List plainText, Uint8List salt) {
  17. return steel.PassCryptRaw.scrypt()
  18. .hash(salt: salt, plain: plainText, len: 32);
  19. }
  20. static Uint8List aesEncrypt(
  21. Uint8List plainText, Uint8List key, Uint8List iv) {
  22. final encrypter = AES(Key(key), mode: AESMode.cbc);
  23. return encrypter
  24. .encrypt(
  25. plainText,
  26. iv: IV(iv),
  27. )
  28. .bytes;
  29. }
  30. static Uint8List aesDecrypt(
  31. Uint8List cipherText, Uint8List key, Uint8List iv) {
  32. final encrypter = AES(Key(key), mode: AESMode.cbc);
  33. return encrypter.decrypt(
  34. Encrypted(cipherText),
  35. iv: IV(iv),
  36. );
  37. }
  38. static Future<String> encryptFileToFile(
  39. String sourcePath, String destinationPath, String password) async {
  40. final args = Map<String, dynamic>();
  41. args["password"] = password;
  42. args["source"] = sourcePath;
  43. args["destination"] = destinationPath;
  44. return Computer().compute(runEncryptFileToFile, param: args);
  45. }
  46. static Future<String> encryptDataToFile(
  47. Uint8List source, String destinationPath, String password) async {
  48. final args = Map<String, dynamic>();
  49. args["password"] = password;
  50. args["source"] = source;
  51. args["destination"] = destinationPath;
  52. return Computer().compute(runEncryptDataToFile, param: args);
  53. }
  54. static Future<Uint8List> encryptDataToData(
  55. Uint8List source, String password) async {
  56. final destinationPath =
  57. Configuration.instance.getTempDirectory() + Uuid().v4();
  58. return encryptDataToFile(source, destinationPath, password).then((value) {
  59. final file = io.File(destinationPath);
  60. final data = file.readAsBytesSync();
  61. file.deleteSync();
  62. return data;
  63. });
  64. }
  65. static Future<void> decryptFileToFile(
  66. String sourcePath, String destinationPath, String password) async {
  67. final args = Map<String, dynamic>();
  68. args["password"] = password;
  69. args["source"] = sourcePath;
  70. args["destination"] = destinationPath;
  71. return Computer().compute(runDecryptFileToFile, param: args);
  72. }
  73. static Future<Uint8List> decryptFileToData(
  74. String sourcePath, String password) {
  75. final args = Map<String, dynamic>();
  76. args["password"] = password;
  77. args["source"] = sourcePath;
  78. return Computer().compute(runDecryptFileToData, param: args);
  79. }
  80. static Future<Uint8List> decryptDataToData(
  81. Uint8List source, String password) {
  82. final sourcePath = Configuration.instance.getTempDirectory() + Uuid().v4();
  83. final file = io.File(sourcePath);
  84. file.writeAsBytesSync(source);
  85. return decryptFileToData(sourcePath, password).then((value) {
  86. file.deleteSync();
  87. return value;
  88. });
  89. }
  90. }
  91. Future<String> runEncryptFileToFile(Map<String, dynamic> args) {
  92. final encrypter = getEncrypter(args["password"]);
  93. return encrypter.encryptFile(args["source"], args["destination"]);
  94. }
  95. Future<String> runEncryptDataToFile(Map<String, dynamic> args) {
  96. final encrypter = getEncrypter(args["password"]);
  97. return encrypter.encryptDataToFile(args["source"], args["destination"]);
  98. }
  99. Future<String> runDecryptFileToFile(Map<String, dynamic> args) async {
  100. final encrypter = getEncrypter(args["password"]);
  101. return encrypter.decryptFile(args["source"], args["destination"]);
  102. }
  103. Future<Uint8List> runDecryptFileToData(Map<String, dynamic> args) async {
  104. final encrypter = getEncrypter(args["password"]);
  105. return encrypter.decryptDataFromFile(args["source"]);
  106. }
  107. AesCrypt getEncrypter(String password) {
  108. final encrypter = AesCrypt(password);
  109. encrypter.aesSetMode(AesMode.cbc);
  110. encrypter.setOverwriteMode(AesCryptOwMode.on);
  111. return encrypter;
  112. }