AES-шифрование

Привет,
Я хотел бы иметь пример шифрования и дешифрования 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, это удивительно мне поможет.

Спасибо вам всем

2

Решение

Я не собираюсь предоставлять полный пример кода, но если Если вы хотите использовать криптографию Dart, вы должны использовать шифрование в режиме счетчика (CTR), просто потому, что это, кажется, единственный реальный режим шифрования AES, реализованный Dart.

CTR также называется режимом SIC, и реализацию можно найти Вот. Это услужливо использует ParametersWithIV, Если вы используете нерандомизированный одноразовый номер, вы должны поместить его в верхний порядок (крайний левый, начиная с байтового индекса 0, так как режим CTR обычно с прямым порядком байтов) в конце IV.

3

Другие решения

Я наконец-то получил пример шифрования и расшифровки, поэтому отвечаю на свой вопрос. Самый простой способ — использовать алгоритм Salsa20, затем преобразовать все в шестнадцатеричную строку перед сериализацией и отправить ее.

  • зашифровать данные
  • закодировать IV в шестнадцатеричную строку
  • закодировать зашифрованные данные в шестнадцатеричную строку
  • сериализовать все и отправить через сеть
  • другой конец сети декодирует шестнадцатеричную строку, чтобы получить IV и зашифрованные данные.
  • затем используйте тот же IV, тот же ключ (неявно установленный, чтобы быть тем же самым), чтобы расшифровать данные

Ниже приведен код шифрования / дешифрования без отправки по сети.

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);
}
2

По вопросам рекламы [email protected]