Как сделать шифрование, как Android "PBEWithMD5AndDES" в трепетать дротик? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь воссоздать существующие мобильные приложения во флаттере, но борюсь с шифрованием "PBEWithMD5AndDES" на Android, которое, похоже, не может найти аналогичный способ в дротике.

Это то, чего я пытался добиться с помощью библиотек Flutter_Des.dart, Password_Hash.dart и Crypto.dart, но все еще не могу получить тот же вывод.

encryptPassword(String keyStr, String passwordStr) async {
    if (keyStr.length == 0 || passwordStr.length == 0) {
      return "";
    }

    var generator = new PBKDF2(hashAlgorithm: md5);
    String saltStr = generateSaltBase64String();

    var hash = generator.generateBase64Key(keyStr, saltStr, round, keyLength);
    var encryptBase64 = await FlutterDes.encryptToBase64(passwordStr, hash.toString());

    return encryptBase64;
  }

Ниже приведено то, что у меня сейчас есть на Android.

KeySpec keySpec = new PBEKeySpec(str.toCharArray(), salt, iterationCount);
        SecretKey key = SecretKeyFactory.getInstance("PBEWithMD5AndDES").generateSecret(keySpec);
        AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt, iterationCount);
        ecipher = Cipher.getInstance("PBEWithMD5AndDES");

        ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
        byte[] utf8 = password.getBytes("UTF8");
        byte[] enc = ecipher.doFinal(utf8);
        enc = Base64.encode(enc, Base64.DEFAULT);
        return new String(enc);

Я ожидаю того же вывода, что и для Android, поэтому мой бэкэнд сможет его расшифровать.

Ответы [ 2 ]

1 голос
/ 23 мая 2019

PBEWithMD5AndDES использует PBKDF1 для генерации материала ключа (не PBKDF2).Это дает вам 128 битов ключевого материала, который вы затем используете в качестве двух 64-битных половинок в качестве ключа и IV для DES.

Получите ключ и IV следующим образом - я добавил некоторые произвольные значения для итерации, пароль и соль и подтверждено против JCrypto.

  int iterations = 31;

  List<int> salt = [0x21, 0x21, 0xf0, 0x55, 0xc3, 0x9f, 0x5a, 0x75];
  List<int> password = utf8.encode('test');

  List<int> saltedKey = password + salt;

  Digest d = md5.convert(saltedKey);
  for (int i = 1; i < iterations; i++) {
    d = md5.convert(d.bytes);
  }

  print(d);

  List<int> key = d.bytes.sublist(0, 8);
  List<int> iv = d.bytes.sublist(8, 16);
  print(key);
  print(iv);

Я не могу найти реализацию Dart DES, которая принимает ключ и IV как байты.triple_des хочет, чтобы они были в виде струн - то есть он тупой.Заостренный замок не делает DES.FlutterDes также, кажется, хочет строки.Вы можете изменить triple_des, чтобы получать двоичные ключи и IV.Или используйте другой шифр.

0 голосов
/ 17 июня 2019

Решено с использованием метода канала flutter и кода вызова конкретной платформы, чтобы выполнить шифрование и его работу сейчас. Спасибо

...