如何解密Dart中的加密值?

时间:2018-07-03 12:06:59

标签: encryption dart sha256 hmac

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

这是例子;

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(?????????); 

}

5 个答案:

答案 0 :(得分:1)

过去曾建议使用PointyCastle(https://pub.dartlang.org/packages/pointycastle),但似乎尚未针对Dart 2进行更新。:(

答案 1 :(得分:0)

HMAC是消息身份验证代码。与签名类似,它是用于验证邮件是否被篡改的摘要。它是使用单向哈希函数(在本例中为SHA256)构造的。它不是加密,并且不能逆转,因此无法解密具有 的值。

使用HMAC唯一可以做的就是给定HMAC和相应的纯文本,以验证纯文本的来源以及它是否未被篡改。

看着GitHub page for the Dart crypto library,看起来 only 支持摘要算法。没有列出加密算法,因此,如果要进行实际上可以解密的双向加密,则需要使用其他库。 Cipher库在这方面看起来很有希望。

答案 2 :(得分:0)

实际上,搜索很多东西找不到比这更好的东西。 加密0.2.0 新增功能,并具有Dart 2支持。 https://pub.dartlang.org/packages/encrypt#-installing-tab-

我需要使My Flutter Mobile App和Aqueduct可以共享安全通信的工具。 Leo Cavalcante是个好人。昨天我们谈话时,他很快回答了。因此,这是对Dart的另一种爱。因为每个人都互相支持。

它支持:     AES(块密码)     Salsa20(密码流)     RSA(非对称)(有效)

将此软件包用作库

  1. 依靠它 将此添加到您程序包的pubspec.yaml文件中:

依赖性:   加密:“ ^ 0.2.0”

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

$ pub get

使用Flutter:

$个flutter包得到

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

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

答案 3 :(得分:0)

如果任何人都在寻找一个更简单的解决方案而不必依赖该库,那么我已经编写了有关在dart中对字符串值进行加密和解密的自定义解决方案,该方法显然也可以在flutter中使用。该代码非常简单,因此我将不讨论其代码。加密中使用的策略是x或加密解密。

   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;
  }

答案 4 :(得分:0)

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;
}