嗨,我想用Dart进行AES加密和解密的例子。我在Dart看到有一个图书馆密码
https://www.dartdocs.org/documentation/cipher/0.3.0/cipher.api/cipher.api-library.html
这有助于做到这一点。但我这里有两个问题:
结论,如果有人可以帮助一个使用Dart与任何库(密码/加密)的例子,它可以加密/解密带有2个输入Key和IV的字符串,这将令我惊讶。
谢谢你们
我不打算提供完整的示例代码,但是如果你想使用Dart加密,你应该使用计数器模式(CTR)加密,因为这似乎是Dart实现的唯一实际的AES密码模式。
CTR也称为SIC模式,可以找到here的实现。它有助于使用ParametersWithIV
。如果你要使用一个非随机化的nonce,你应该把它放在高位(最左边,从字节索引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);
}