java 中是否存在以下 Aes 加密函数的 Dart 等效项

Vai*_*kha 5 java serversocket tcpsocket flutter

我已经设置了一个服务器,它通过下面提到的 java 函数侦听加密的字节数组。早些时候,我使用 java (android) 来构建我的应用程序,因此使用相同的 java 函数很容易,但我无法弄清楚该函数的 dart 等效项(flutter)是什么,该函数接受字符串作为输入并返回 AES 加密字节数组作为输出,我可以将其写入 TCP 套接字。

另外,我非常感谢您帮助了解如何将生成的字节数组写入服务器,然后读取类似的响应并通过 dart (颤振)对其进行解密

我已经成功地编写了简单的字符串并通过 dart 接收简单的字符串作为 tcp 服务器的输入和输出,但无法对加密的字节数组执行相同的操作。在java中,我使用DataOutputStream将响应发送到服务器,如下所示

DataOutputStream dOut = newDataOutputStream(socket.getOutputStream());

           byte[] s2 = Encrypt3.encrypt2(myString);

           dOut.writeInt(s2.length); // write length of the message
            dOut.write(s2);
Run Code Online (Sandbox Code Playgroud)

这是我用于aes加密的java函数

import java.security.Key;

import javax.crypto.Cipher;

import javax.crypto.spec.SecretKeySpec;


public class Encrypt3 {
public static String key = "mykey";

public static byte[] encrypt2(String text ){
    String encrypt ="";

    try{
        // Create key and cipher
        Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        // encrypt the text
        cipher.init(Cipher.ENCRYPT_MODE, aesKey);
        byte[] encrypted = cipher.doFinal(text.getBytes());
        return encrypted ;
    }catch(Exception e){
        System.out.println(e);
    }
    return null ;
}


public static String decrypt2(byte[] encrypted2){
    String decrypt ="";
    try{
        Key aesKey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        // decrypt the text
        cipher.init(Cipher.DECRYPT_MODE, aesKey);
        decrypt = new String(cipher.doFinal(encrypted2));
    }catch(Exception e){
        System.out.println(e);
    }

    return decrypt ;
}


}
Run Code Online (Sandbox Code Playgroud)

我希望当提供字符串作为输入时,在 dart 中生成等效的字节数组,然后将字节数组写入 tcp 服务器。

先感谢您

Ric*_*eap 4

配置 Java 密码的方式默认为电子密码书 (ECB) 模式,该模式不应在真正的密码系统中使用。您还依赖于默认填充 - PKCS5。

使用pointycastle包含以下导入的包:

import 'package:pointycastle/api.dart';
import 'package:pointycastle/block/aes_fast.dart';
import 'package:pointycastle/paddings/pkcs7.dart';
import 'package:pointycastle/padded_block_cipher/padded_block_cipher_impl.dart';
import 'package:pointycastle/block/modes/ecb.dart';
Run Code Online (Sandbox Code Playgroud)

Dart 中的近似等效项是:

List<int> encrypt2(String text) {
  // key must be 16 or 32 bytes - not sure how "mykey" could work
  // key should really be binary, not a String! Better to use a KDF.
  Uint8List key = Uint8List.fromList(
    utf8.encode('0123456789abcdef'),
  );

  PaddedBlockCipher cipher = PaddedBlockCipherImpl(
    PKCS7Padding(), // Java defaults to PKCS5 which is equivalent
    ECBBlockCipher(AESFastEngine()), // Very weak mode - don't use this in the real world
  );

  cipher.init(
    true,
    PaddedBlockCipherParameters<CipherParameters, CipherParameters>(
      KeyParameter(key),
      null,
    ),
  );

  return cipher.process(utf8.encode(text)); // this isn't the same as .toBytes, except for ASCII
}
Run Code Online (Sandbox Code Playgroud)