如何在Flutter中加密字符串并在其他设备上解密该加密字符串?

4

enter image description here

我找到了一个用于Flutter的加密包,可以用它来加密和解密消息。我成功地进行了加密和解密,但是在像下面这个例子中,我无法在分离的设备上使用它。
这里有一个例子,我用一个静态字符串和一个随机数组成明文,这样可以改变生成的密钥。当我解密时,使用正则表达式匹配找到静态字符串。
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个回答

5
你正在尝试使用encrypt包存在严重问题。通过使用Key.forLength(),你实际上使用了一个由0000000....000组成的密钥。同样的情况也出现在IV中。这不是一个非常安全的密钥!在两个不同的计算机之间使用加密系统时,需要找到一种共享密钥的方法——所谓的“共享秘密”。你可以使用 PKKDF2 从“密码短语”生成此密钥。或者你可以将随机字节字符串编译进代码中,但需要预期攻击者可能会反向工程你的代码。
使用AES时,不应该使用相同的IV与同一个密钥进行加密,因此加密系统通常在密钥交换期间唯一地生成一个密钥和初始IV,然后使用某些东西(如消息序列号)为使用该密钥加密的每个消息更改IV。
对于像你这样的测试目的,你可能希望使用类似这个的随机数生成器生成一个固定的16位密钥和固定的16位IV。然后使用.fromBase64()构造函数。
var key = Key.fromBase64('yE9tgqNxWcYDTSPNM+EGQw=='); // obviously, insert your own value!
var iv = IV.fromBase64('8PzGKSMLuqSm0MVbviaWHA==');

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


5
您可以使用这个方法:

String encrypted = "68e4sg68es4ges68g4";
    
final decrypted = encrypter.decrypt(encrypt.Encrypted.fromBase64(encrypted),iv:iv);

这个答案很好,但要注意加密的字符串是来自base64编码。例如,使用类似"encrypted.base64"而不是简单的"encrypted"。 - arlegil youmba tchokothe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接