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

Nit*_*euq 4 encryption flutter

在此输入图像描述

\n\n

我找到了用于 flutter 加密和解密消息的加密包,我成功地加密和解密,但没有成功地在如图所示的分离设备的 cas 中使用它。

\n\n

这是一个示例,其中我用静态字符串和随机数组成明文,它允许更改生成的密钥,当我解密时,找到与正则表达式匹配的静态字符串

\n\n
var number = new Random();\n\n var random= number.nextInt(100); \n\n  final plainText = \'static_name$random\';\n\n  final key = Key.fromLength(16);\n  final iv = IV.fromLength(8);\n  final encrypter = Encrypter(AES(key));\n\n  final encrypted = encrypter.encrypt(plainText, iv: iv);\n  final decrypted = encrypter.decrypt(encrypted, iv: iv);\n\n  print(encrypted.base64);//my plaintext is encrypted fesesgesgneslg465esg6es4g\n  print(decrypted); //my random plaintext is decrypted static_name$rnd\n\n  //my regex match function\n
Run Code Online (Sandbox Code Playgroud)\n\n

目前我不知道如何输入我的加密密钥(fesesgesgneslg465esg6es4g)我搜索做类似的事情

\n\n

//---------按时生成一个我加密的随机密钥----\n var rng = new Random();

\n\n
 var rnd= rng.nextInt(100); //choisir le nombre max de contenu de la cat\xc3\xa9gorie\n\n  final plainText = \'static_name$rnd\';\n\n  final key = Key.fromLength(16);\n  final iv = IV.fromLength(8);\n  final encrypter = Encrypter(AES(key));\n\n  final encrypted = encrypter.encrypt(plainText, iv: iv);\n\n//output : 68e4sg68es4ges68g4\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
encrypted=68e4sg68es4ges68g4;\n\n  final key = Key.fromLength(16);\n  final iv = IV.fromLength(8);\n  final encrypter = Encrypter(AES(key));\n\nfinal decrypted = encrypter.decrypt(encrypted, iv: iv);\n  print(decrypted);\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

简而言之,我成功地自动加密和解密输入,但没有成功地将生成的密钥手动添加到解密函数中。

\n

Ric*_*eap 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==');
Run Code Online (Sandbox Code Playgroud)

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


小智 5

你可以使用这个方法:

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