【问题标题】:is there a Dart Equivalent of the following Aes Encryption function in javajava中是否有以下Aes加密函数的Dart等价物
【发布时间】:2019-04-25 21:25:08
【问题描述】:

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

我也非常感谢帮助我了解如何将生成的字节数组写入服务器,然后读取类似的响应并通过 dart (flutter) 解密它

我已经成功地编写了简单的字符串并通过 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);

这是我用于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 ;
}


}

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

提前谢谢你

【问题讨论】:

  • 我正在使用相同的加密和解密功能。​​所以,请分享您在颤振中创建的用于加密解密的类和用于转换数据的 api 函数

标签: java flutter serversocket tcpsocket


【解决方案1】:

您配置 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';

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
}

【讨论】:

  • 我是加密新手,我在flutter中实现了这个功能,这给我返回了一个List,我想把这个列表写到我的服务器然后在那里解密,可以吗?只需 sock.write(encryptedList) 将其写入我的服务器?你能给我dart和java的加密和解密功能吗?您还建议我使用与 pkcs7 不同的填充吗?
  • 可能是sock.add in dart 发送。 dart 加密应该与问题中现有的 java 解密相匹配。目前,您可以接受 Pkcs5/7 填充。您的主要问题来自使用欧洲央行。阅读维基百科以了解原因。解密是相同的,但将 true 更改为 false :-)
  • 非常感谢,我已成功加密字符串并在我的服务器上解密但是我无法在飞镖端解密,我通过加密收到了这个字符串 'Öb9÷Ñ\^] vê~§ Ó<...>' 实际上是“文本数据”。我尝试在解密中输入 false,但是当我将此字符串传递给 dart 中的解密函数时,它给了我这个错误“无效参数:输入数据长度必须是密码块大小的倍数”
  • Ob9... 不是字节数组,因此不确定您希望如何解密它。您从哪里获取加密数据?您的 Java 函数返回 byte[] 如您所料。
  • 我被困在 1.) 我从服务器接收字节流的方式。和 2.) 解密函数的返回类型,返回语句 1.) 要在 dart 上接收我正在使用 sock.listen((data) { } 我假设数据是我期望的字节流,或者我应该使用标准输入 (如果可能,请给出示例 sn-p) 2.)我的解密函数的返回类型是字符串,它需要一个列表作为参数(我们收到的那个),我在 cipher.init 中将 true 更改为 false,现在应该是这个的返回语句吗?
猜你喜欢
  • 1970-01-01
  • 2011-05-28
  • 1970-01-01
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2018-08-07
  • 2020-09-20
  • 2014-02-26
相关资源
最近更新 更多