如何在flutter中的其他设备中加密字符串并解密此加密字符串?

时间:2019-07-19 09:17:46

标签: encryption flutter

enter image description here

我发现加密包可以使flutter加密和解密消息,我成功地加密和解密,但是没有成功在如图所示的分离设备的cas中使用它。

这里是一个示例,其中我用一个静态字符串和一个随机数组成一个纯文本,它允许更改生成的密钥,当我解密时,发现带有正则表达式匹配的静态字符串

var number = new Random();

 var random= number.nextInt(100); 

  final plainText = 'static_name$random';

  final key = Key.fromLength(16);
  final iv = IV.fromLength(8);
  final encrypter = Encrypter(AES(key));

  final encrypted = encrypter.encrypt(plainText, iv: iv);
  final decrypted = encrypter.decrypt(encrypted, iv: iv);

  print(encrypted.base64);//my plaintext is encrypted fesesgesgneslg465esg6es4g
  print(decrypted); //my random plaintext is decrypted static_name$rnd

  //my regex match function

目前,我找不到如何输入加密密钥(fesesgesgneslg465esg6es4g)的方法,我试图这样做

// ---------在按下时,我会生成一个我加密的随机密钥----       var rng = new Random();

 var rnd= rng.nextInt(100); //choisir le nombre max de contenu de la catégorie

  final plainText = 'static_name$rnd';

  final key = Key.fromLength(16);
  final iv = IV.fromLength(8);
  final encrypter = Encrypter(AES(key));

  final encrypted = encrypter.encrypt(plainText, iv: iv);

//output : 68e4sg68es4ges68g4

// ---------用户在第二台设备上输入密钥(68e4sg68es4ges68g4)----

encrypted=68e4sg68es4ges68g4;

  final key = Key.fromLength(16);
  final iv = IV.fromLength(8);
  final encrypter = Encrypter(AES(key));

final decrypted = encrypter.decrypt(encrypted, iv: iv);
  print(decrypted);

我找不到如何解密我的密钥(68e4sg68es4ges68g4)

一句话,我成功地对输入进行了自动加密和解密,但是没有成功地将生成的密钥手动添加到解密函数中。

2 个答案:

答案 0 :(得分:1)

您尝试使用encrypt软件包的方式存在严重问题。通过使用Key.forLength(),您基本上是在使用0000000....000键。 IV也一样。这不是一个非常安全的密钥!

在两台不同的机器之间使用加密系统时,您需要找到某种在它们之间共享密钥的方法-所谓的“共享机密”。您可以使用例如PKKDF2从“密码”生成此密码。或者,您可以只将随机字节字符串编译到代码中,但是希望攻击者可以对您的代码进行反向工程。

使用AES,您不应使用相同的密钥两次使用相同的IV,这就是为什么密码系统通常会在密钥交换期间唯一地生成密钥和初始IV,然后使用某些东西(例如消息序列号)进行更改的原因用该密钥加密的每封邮件的IV。

出于测试目的,您可能希望像this这样的随机数生成器生成固定的16位密钥和固定的16位IV。然后使用.fromBase64()构造函数。

var key = Key.fromBase64('yE9tgqNxWcYDTSPNM+EGQw=='); // obviously, insert your own value!
var iv = IV.fromBase64('8PzGKSMLuqSm0MVbviaWHA==');

在加密和解密应用程序中对密钥和IV使用相同的值。

答案 1 :(得分:1)

你可以使用这个

encrypted="68e4sg68es4ges68g4";

最终解密 = encrypter.decrypt(encrypt.Encrypted.fromBase64(encrypted),iv:iv);