Как заполнить необходимые параметры для метода cipher.doFinal() в Dart?

Я пытаюсь выполнить шифрование в своем приложении Flutter, используя пакет pointy_castle, который похож на библиотеку crypto.Cipher в Java. Существует метод под названием doFinal(), в Java вы можете назначить один параметр. Находясь в Dart, вы должны назначить четыре параметра. Итак, как я могу правильно заполнить необходимые параметры? Мне нужен пример того, как это сделать.

В пакетной документации doFinal(Uint8List inp, int inpOff, Uint8List out, int outOff) → int

Это код на Java:

 ...
    byte[] encrypted;
    encrypted = cipher.doFinal(padString(text).getBytes());
    String finalData = bytesToHex(encrypted);
    return finalData;
 ...

И в Дарте:

...
    Uint8List encrypted; // <- I have to make it of type Uint8List because _bytesToHex method requires looping through the list. However, it produces an error because of that: `A value of type 'int' can't be assigned to a variable of type 'Uint8List'.`
    encrypted = cipher.doFinal(utf8.encode(_padString(data))); // <- This produces an error since doFinal() requires 4 params.
    String finalData = _bytesToHex(encrypted);
    return finalData;
...

Описание в документах кажется довольно ясным и полным. Какую часть вы не понимаете?

President James K. Polk 22.05.2019 14:58

Как мне правильно заполнить параметры в моем случае?

Omar Hussein 22.05.2019 15:03

До сих пор не ясно какие в документации, которой вам не хватило. Учитывая, что вы хотите зашифровать все данные во входном списке и записать результат в начало выходного списка, какими будут разумные значения для каждого из параметров?

Michael 22.05.2019 15:33

@ Майкл Я пытался выполнить то, что вы объяснили, но, к сожалению, мне не повезло, не могли бы вы быть более конкретным?

Omar Hussein 22.05.2019 16:24

Параметры объясняются в документации doFinal, см. здесь. Также обратите внимание, что лучше использовать process (см. описание PaddedBlockCipher там же). Пример (AES-CBC, заполнение PKCS7) можно найти здесь. пример употребления doFinal можно найти в теле process, см. здесь.

Topaco 23.05.2019 09:26
Основы программирования на Java
Основы программирования на Java
Java - это высокоуровневый объектно-ориентированный язык программирования, основанный на классах.
Концепции JavaScript, которые вы должны знать как JS программист!
Концепции JavaScript, которые вы должны знать как JS программист!
JavaScript (Js) - это язык программирования, объединяющий HTML и CSS с одной из основных технологий Всемирной паутины. Более 97% веб-сайтов используют...
3
5
279
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если кто сталкивался с этим случаем. Вот что у меня получилось:

import 'package:pointycastle/export.dart';

class Example {
  Uint8List encrypt(String data) {
    if (data == null || data.length == 0) return null;
    final Uint8List _key = utf8.encode('key');
    final Uint8List _iv = utf8.encode('iv');
    try {
      Uint8List encrypted;
      final CipherParameters params = PaddedBlockCipherParameters(
        ParametersWithIV(
          KeyParameter(_key),
          _iv,
        ),
        null,
      );
      final PaddedBlockCipherImpl cipher = PaddedBlockCipherImpl(
        PKCS7Padding(),
        CBCBlockCipher(
          AESFastEngine(),
        ),
      );
      cipher.init(true, params);
      encrypted = cipher.process(utf8.encode(data));
      return encrypted;
    } catch (_) {
      print(_);
      return null;
    }
  }

  String decrypt(Uint8List data) {
    if (data == null || data.length == 0) return null;
    final Uint8List _key = utf8.encode('key');
    final Uint8List _iv = utf8.encode('iv');
    try {
      final CipherParameters params = PaddedBlockCipherParameters(
        ParametersWithIV(
          KeyParameter(_key),
          _iv,
        ),
        null,
      );
      final PaddedBlockCipherImpl cipher = PaddedBlockCipherImpl(
        PKCS7Padding(),
        CBCBlockCipher(
          AESFastEngine(),
        ),
      );
      cipher.init(false, params);
      final String finalData = utf8.decode(cipher.process(data));
      return finalData;
    } catch (_) {
      print(_);
      return null;
    }
  }
}

Спасибо https://stackoverflow.com/users/9014097/топако и https://github.com/Nguyenpk57 за вдохновение.

Другие вопросы по теме