Привет,
Я хотел бы иметь пример шифрования и дешифрования AES с помощью Dart. Я видел в Dart есть библиотека шифра
https://www.dartdocs.org/documentation/cipher/0.3.0/cipher.api/cipher.api-library.html
это может помочь сделать это. Но у меня есть 2 проблемы здесь:
Простой пример шифрования строки и ее дешифрования для получения начальной строки.
Мне нужно, чтобы он работал с другими библиотеками AES, при условии, что они все соответствуют стандарту. В частности, у меня есть мой фронтенд в Dart и бэкэнд в C ++, который я планирую использовать для этой цели crypto ++. Дело в crypto ++, обязательные входные данные — ключ и вектор инициализации (IV), в то время как в Dart / cipher, кажется, не требуется IV. Интересно, отличаются ли входные требования, они не могут работать вместе.
Вывод: если кто-то может помочь с примером использования Dart с какой-либо библиотекой (cipher / crypto), которая может зашифровать / расшифровать строку с двумя входами Key и IV, это удивительно мне поможет.
Спасибо вам всем
Я не собираюсь предоставлять полный пример кода, но если Если вы хотите использовать криптографию Dart, вы должны использовать шифрование в режиме счетчика (CTR), просто потому, что это, кажется, единственный реальный режим шифрования AES, реализованный Dart.
CTR также называется режимом SIC, и реализацию можно найти Вот. Это услужливо использует ParametersWithIV
, Если вы используете нерандомизированный одноразовый номер, вы должны поместить его в верхний порядок (крайний левый, начиная с байтового индекса 0, так как режим CTR обычно с прямым порядком байтов) в конце IV.
Я наконец-то получил пример шифрования и расшифровки, поэтому отвечаю на свой вопрос. Самый простой способ — использовать алгоритм Salsa20, затем преобразовать все в шестнадцатеричную строку перед сериализацией и отправить ее.
Ниже приведен код шифрования / дешифрования без отправки по сети.
import "dart:typed_data";
import 'dart:convert';
import "package:cipher/cipher.dart";
import "package:cipher/impl/base.dart";
Uint8List StringToUint8List( String s ) {
var ret = new Uint8List(s.length);
for( var i=0 ; i<s.length ; i++ ) {
ret[i] = s.codeUnitAt(i);
}
return ret;
}
/// UTF16 Decoding
String Uint8ListToString( Uint8List ui ) {
String s = new String.fromCharCodes(ui);
return s;
}
void main() {
initCipher();
final testStr = "Hello, i am a very very very very very very very very long string, please encrypte me";
final ivStr = "2urPAr4H"; // Need to have size 8
final keyStr = "QuJuesMhcssE4e8Q4Kt1XCJW3tcpzcEI"; // Need to have size 32
final _ivEncoded = UTF8.encode(ivStr);
final _keyEncoded = UTF8.encode(keyStr);
final _key = new KeyParameter(_keyEncoded);
final params = new ParametersWithIV(_key,_ivEncoded);
var cipher = new StreamCipher( "Salsa20" );
cipher..reset()..init( true, params );
var encryptedEncodedData = cipher.process( StringToUint8List(testStr) );
var encryptedDataStr = Uint8ListToString(encryptedEncodedData);
cipher..reset()..init( false, params );
var dencryptedEncodedData = cipher.process( StringToUint8List(encryptedDataStr) );
var dencryptedDataStr = Uint8ListToString(dencryptedEncodedData);
//expect(testStr, dencryptedDataStr);
}