解密Flutter上的AES输入,当在web上使用cryptoJS AES时

问题描述 投票:-1回答:2

在网上,我使用CryptoJS解密JS:

CryptoJS.AES.decrypt(inputBase64,key).toString(CryptoJS.enc.Utf8);

例:

输入:“tzfwnxVwE / qNoaWRRfqLp11ZyhB4UtKO + 0 / Lvv5B7eE =”key:“20190225165436_15230006321670000_15510884759030000”

在颤动时,我找不到任何用任何长度的密钥解密的库。

我知道“对于AES,NIST选择了Rijndael系列的三个成员,每个成员的块大小为128位,但有三种不同的密钥长度:128,192和256位。”

但我不知道如何将任何长度的密钥转换为128位格式?

encryption flutter aes cryptojs
2个回答
1
投票

当您将CryptoJS作为密钥传递给密钥时,它将其视为密码短语,并使用密钥派生函数(在本例中为PBKDF2)从密钥生成密钥生成密钥。它生成256位密钥和128位初始化向量(IV)。然后使用它们进行加密/解密。您还需要找出CryptoJS使用的链接方法(可能是密码块链接(CBC))以及它使用的填充方法(以确保纯文本是128位块的轮数 - 可能是PKCS#7)。

CryptoJS具有“开箱即用”的模式,但它并不是特别清楚它在幕后做什么 - 你需要阅读源代码或搜索文档。

当试图在两种系统/语言之间进行互操作时,最好是你继续掌控事物,而不是让一端做出任意决定。这样,您可以确保每端的设置相同。

所以,您可以选择:

  • 使用PBKDF2从字符串密码短语生成128位密钥和128位IV - 例如,9999轮
  • 使用PKCS#7填充
  • 在CBC模式下使用AES

pointycastle包支持Dart中的所有内容。看起来CryptoJS也支持所有这些。

从密码短语开始,确保您可以在JS和Dart中生成相同的密钥和IV。然后转到创建密码。

请记住,永远不要使用相同的密钥/ IV对加密两条消息。例如,使用消息序列号稍微更改每条消息的IV。


0
投票

我在图书馆里搜索过它,但是对我来说这对我的工作来说太少了吗?你有任何用dart编写的类似例子,在网上使用cryptoJS

© www.soinside.com 2019 - 2024. All rights reserved.