【发布时间】:2021-02-09 11:20:02
【问题描述】:
我正在解密用 java 加密的 dart 中的文本。这是用于加密的java代码。
package aes;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Aes {
public static void main(String[] args) {
try {
String keyString = "1234567890123456";//length of key is 16
Cipher desCipher = Cipher.getInstance("AES");
byte[] key = keyString.getBytes("UTF-8");
MessageDigest sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16); // use only first 128 bit
SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
desCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec);
String plainText = "abcd";
byte[] text = plainText.getBytes("UTF-8");
byte[] textencrypted = desCipher.doFinal(text);
System.out.println("encrypted: " + new String(textencrypted));
} catch (Exception ex) {
Logger.getLogger(Aes.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
Cipher desCipher = Cipher.getInstance("AES");这里没有定义加密模式。我发现当模式未定义时,它使用AES/ECB/PKCS5Padding。加密期间也不使用 IV。
我正在将 java android 应用程序迁移到颤振。服务器上的数据是使用上面的 java 代码加密的。现在我无法从服务器更改所有正在使用的数据。我必须在颤振中解密它才能在颤振应用中显示数据。
我在 dart 中使用encrypt: ^4.1.0 包进行解密。
Encrypted encryptedText = Encrypted.fromUtf8('ßȶ8)\œå7£');
final key = Key.fromUtf8('1234567890123456');
final iv = IV.fromLength(16);
final encrypter = Encrypter(AES(key, mode: AESMode.ecb));
final decrypted = encrypter.decrypt(encryptedText, iv: iv);
print(decrypted);
但是这段代码给出的错误如下
E/flutter (18070): [ERROR:flutter/lib/ui/ui_dart_state.cc(171)] Unhandled Exception: Invalid argument(s): Input data length must be a multiple of cipher's block size
E/flutter (18070): #0 PaddedBlockCipherImpl.process (package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart:60:9)
E/flutter (18070): #1 AES.decrypt (package:encrypt/src/algorithms/aes.dart:55:22)
E/flutter (18070): #2 Encrypter.decryptBytes (package:encrypt/src/encrypter.dart:25:17)
E/flutter (18070): #3 Encrypter.decrypt (package:encrypt/src/encrypter.dart:31:17)
E/flutter (18070): #4 _MyHomePageState.sha1 (package:flutter_decrypt_video/main.dart:196:33)
E/flutter (18070): #5 _MyHomePageState.build (package:flutter_decrypt_video/main.dart:85:5)
E/flutter (18070): #6 StatefulElement.build (package:flutter/src/widgets/framework.dart:4681:28)
E/flutter (18070): #7 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4564:15)
E/flutter (18070): #8 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4737:11)
E/flutter (18070): #9 Element.rebuild (package:flutter/src/widgets/framework.dart:4280:5)
E/flutter (18070): #10 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4543:5)
E/flutter (18070): #11 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4728:11)
E/flutter (18070): #12 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4538:5)
E/flutter (18070): #13 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3508:14)
E/flutter (18070): #14 Element.updateChild (package:flutter/src/widgets/framework.dart:3266:18)
E/flutter (18070): #15 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5892:14)
E/flutter (18070): #16 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3508:14)
E/flutter (18070): #17 Element.updateChild (package:flutter/src/widgets/framework.dart:3266:18)
E/flutter (18070): #18 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4589:16)
E/flutter (18070): #19 Element.rebuild (package:flutter/src/widgets/framework.dart:4280:5)
E/flutter (18070): #20 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4543:5)
E/flutter (18070): #21 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4538:5)
E/flutter (18070): #22 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3508:14)
E/flutter (18070): #23 Element.updateChild (package:flutter/src/widgets/framework.dart:3266:18)
E/flutter (18070): #24 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5892:14)
E/flutter (18070): #25 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3508:14)
E/flutter (18070): #26 Element.updateChild (package:flutter/src/widgets/framework.dart:3266:18)
E/flutter (18070): #27 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5892:14)
E/flutter (18070): #28 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3508:14)
E/flutter (18070): #29 Element.updateChild (package:flutter/src/widgets/framework.dart:3266:18)
E/flutter (18070): #30 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4589:16)
E/flutter (18070): #31 StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4737:11)
E/flutter (18070): #32 Element.rebuild (package:flutter/src/widgets/framework.dart:4280:5)
E/flutter (18070): #33 ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4543:5)
E/flutter (18070): #34 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:4728:11)
E/flutter (18070): #35 ComponentElement.mount (package:flutter/src/widgets/framework.dart:4538:5)
E/flutter (18070): #36 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3508:14)
E/flutter (18070): #37 Element.updateChild (package:flutter/src/widgets/framework.dart:3266:18)
E/flutter (18070): #38 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5892:14)
E/flutter (18070): #39 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3508:14)
E/flutter (18070): #40 Element.updateChild (package:flutter/src/widgets/framework.dart:3266:18)
E/flutter (18070): #41 SingleChildRenderObjectElement.mount (package:flutter/src/widgets/framework.dart:5892:14)
E/flutter (18070): #42 Element.inflateWidget (package:flutter/src/widgets/framework.dart:3508:14)
E/flutter (18070): #43 Element.updateChild (package:flutter/src/widgets/framework.dart:3266:18)
E/flutter (18070): #44 ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4589:16)
E/flutter (18070): #45 StatefulElement.performRebuild (package:flutter/src/widgets/fram
如果有人知道怎么做,请说出你的答案。
在用于加密的java代码中,SHA-1哈希算法用于获取160位密钥,然后使用前128位进行加密,可能会导致任何问题吗?
如果有人知道任何其他可以解决我的问题的软件包,请告诉我。
如果有人想了解更多信息,请告诉我。
提前致谢!!
【问题讨论】:
-
在 Java 代码中,密钥是由 SHA-1 派生的,而 Dart 代码中缺少该密钥。因此使用了不同的密钥,从而导致解密失败。此外,在 Java 代码中,密文使用字符集编码进行编码,这通常会破坏数据。使用像 Base64 这样的二进制到文本编码。此外,在 Java 代码中应该完全指定算法和编码。顺便说一句,使用哪种默认编码(即
new String(textencrypted)使用什么编码)?请注意,欧洲央行是不安全的。 -
encrypt 是一些 Pointy Castle 功能的包装器。 Pointy Castle 本身更广泛,可以作为替代方案。
-
谢谢!!我也对 SHA-1 有疑问,所以我已经尝试在 dart 中应用 SHA1,但是当我在 java 和 dart 中应用 SHA1 后比较密钥的字节时,这两个输出不一样.. java 中的一些字节为负但在飞镖都是积极的。我为此尝试了Castle和crypto包,两者都提供相同的输出,但与由java代码计算的字节不匹配。 @Topaco 如果您有任何代码 sn-p 请分享。
-
最好比较十六进制编码的数据。此外,如果您已将问题缩小到密钥派生,那么您应该编辑您的问题并发布密钥派生的 dart 代码,最好与示例数据一起发布。还要发布 Java 代码的结果(用于密钥派生)。那么就有可能找出问题所在。
-
好的,我将发布另一个关于密钥派生的问题。但是一旦请看flutter抛出的异常。它说输入数据长度必须是密码块大小的倍数。密钥肯定是错误的,但使用此密钥算法可以解密它并且可以显示一些不可读的文本,但它给出了异常。而“ßȶ8)\œå7£”是“shubham”字的加密,即加密的消息是有效的。 @Topaco
标签: flutter dart encryption cryptography aes