Я пытаюсь выполнить шифрование в своем приложении 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;
...
Как мне правильно заполнить параметры в моем случае?
До сих пор не ясно какие в документации, которой вам не хватило. Учитывая, что вы хотите зашифровать все данные во входном списке и записать результат в начало выходного списка, какими будут разумные значения для каждого из параметров?
@ Майкл Я пытался выполнить то, что вы объяснили, но, к сожалению, мне не повезло, не могли бы вы быть более конкретным?
Если кто сталкивался с этим случаем. Вот что у меня получилось:
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 за вдохновение.
Описание в документах кажется довольно ясным и полным. Какую часть вы не понимаете?