如何解密飞镖中的加密值?

How to decrypt of the encrypted value in dart?

我正在测试 Dart 的加密哈希函数。我找不到任何关于解密的信息? 谁能告诉我如何解密加密值?

这是例子;

import 'dart:convert';
import 'package:crypto/crypto.dart'; 

void main() async { 
  var key = utf8.encode('p@ssw0rd'); 
  var bytes = utf8.encode("Dart and Aqueduct makes my life easier. Thank you."); 


  // TODO: ENCRYPTION 
  var hmacSha256 = new Hmac(sha256, key); // HMAC-SHA256 
  var digest = hmacSha256.convert(bytes); 
 
  print(“————ENCRYPTION—————“); 
  print("HMAC digest as bytes: ${digest.bytes}"); 
  print("HMAC digest as hex string: $digest"); 
  print('\r\n'); 


  // TODO: DECRYPTION 
     ???????????? 
  print(“————DECRYPTION—————“); 
  print(?????????); 

}

HMAC 是消息验证码。它是用于验证消息未被篡改的摘要,类似于签名。它是使用 单向 哈希函数构建的,在本例中为 SHA256。它不是加密,无法逆转,因此您拥有的值无法被解密。

您可以使用 HMAC 做的唯一事情是,在给定 HMAC 和相应的纯文本的情况下,验证纯文本的来源并且它没有被篡改。

查看 GitHub page for the Dart crypto library, it looks like it only supports digest algorithms. There are no encryption algorithms listed, so you will need to use a different library if you want to do two-way encryption which can actually be decrypted. The Cipher 库似乎在这方面很有前途。

PointyCastle (https://pub.dartlang.org/packages/pointycastle) 过去曾被推荐过,但它似乎还没有针对 Dart 2 进行更新。:(

好吧实际上搜索了很多也找不到比这更好的东西了。 encrypt 0.2.0 新增并支持 Dart 2。 https://pub.dartlang.org/packages/encrypt#-installing-tab-

我需要让我的 Flutter 移动应用程序和 Aqueduct 可以共享安全通信的东西。 Leo Cavalcante 是个好人。昨天我们谈话时,他快速回答。所以这是对 Dart 的另一种热爱。因为每个人都互相支持。

它支持: AES(分组密码) Salsa20(流密码) RSA(非对称)(工作)

将此包用作库

  1. 靠谱 将此添加到您的包的 pubspec.yaml 文件中:

依赖项: 加密:“^0.2.0”

  1. 安装它 您可以从命令行安装软件包: 与酒吧:

$ 酒吧得到

使用 Flutter:

$ flutter 包得到

或者,您的编辑器可能支持 pub get 或 flutter packages get。查看编辑器的文档以了解更多信息。

  1. 导入它 现在在你的 Dart 代码中,你可以使用: 导入 'package:encrypt/encrypt.dart';

如果有人正在寻找一个不依赖库的更简单的解决方案,我已经编写了关于在 dart 中加密和解密字符串值的自定义解决方案,它也可以在 flutter 中使用。代码相当简单,所以我不打算讨论代码的工作原理。加密采用的策略是x-or加密-解密

   var encryptionKey ='your encryption key';

   static String encrypt(String data) {
    var charCount = data.length;
    var encrypted = [];
    var kp = 0;
    var kl = encryptionKey.length - 1;

    for (var i = 0; i < charCount; i++) {
      var other = data[i].codeUnits[0] ^ encryptionKey[kp].codeUnits[0];
      encrypted.insert(i, other);
      kp = (kp < kl) ? (++kp) : (0);
    }
    return dataToString(encrypted);
  }

  static String decrypt(data) {
    return encrypt(data);
  }

  static String dataToString(data) {
    var s = "";
    for (var i = 0; i < data.length; i++) {
      s += String.fromCharCode(data[i]);
    }
    return s;
  }

IMO 最简单的方法是使用 encrypt:

import 'package:encrypt/encrypt.dart';

final key = Key.fromUtf8('put32charactershereeeeeeeeeeeee!'); //32 chars
final iv = IV.fromUtf8('put16characters!'); //16 chars

//encrypt
String encryptMyData(String text) {
  final e = Encrypter(AES(key, mode: AESMode.cbc));
  final encrypted_data = e.encrypt(text, iv: iv);
  return encrypted_data.base64;
}

//dycrypt
String decryptMyData(String text) {
  final e = Encrypter(AES(key, mode: AESMode.cbc));
  final decrypted_data = e.decrypt(Encrypted.fromBase64(text), iv: iv);
  return decrypted_data;
}