crypto_util.dart 4.3 KB

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